2017-07-18 18 views
3

これはJSONファイルを読み込み、いくつかのフィールドを変更しようとしているところでは非常に簡単な問題です。Pythonはjson.dumpによって作成されたJSONをロードできません

with open("example.json", "r+") as f: 
    data = json.load(f) 
    # perform modifications to data 
    f.truncate(0) 
    json.dump(data, f) 

それは私が手動でJSONファイルを作成し、正しいJSONファイルを保存された最初の時間を働いていたが、私は同じスクリプトを実行して二回目で、それは私に、このエラーを与える:

ValueError: No JSON object could be decoded

のはなぜですそれ? jsonモジュールはモジュール自体で作成されたファイルを解析できないことは驚きです。

+0

は、ファイルの内容を投稿できる、1行が欠落していますか? – Chris

+0

@Chris vimで手動で作成したオリジナルのJSONファイルには '{}'しか含まれていません。スクリプトは期待された変更を行い、正しいJSON文字列をファイルに保存しました(最後に改行はありません)。 –

+2

残りのコードはどのようなものかわかりませんが、 'f.truncate'はファイルを消去しますファイルカーソルをファイルの先頭に戻しません。カーソルをファイルの先頭に戻したい場合は、 'f.seek(0)'を探しています。 – idjaw

答えて

3

あなたが提供したコードと何をしようとしているか(ファイルカーソルをファイルの先頭に戻します)、実際にはf.truncateでそれをしていません。あなたは実際にファイルをに切り捨てています。すなわち、ファイルを完全に消去する。 truncate法上のhelpパー

:あなたが実際に戻って、ファイルの先頭にカーソルを返すことで何を探している何

truncate(...) 
    truncate([size]) -> None. Truncate the file to at most size bytes. 

    Size defaults to the current file position, as returned by tell(). 

seekを使用しています。

求めるのヘルプ:だから

seek(...) 
    seek(offset[, whence]) -> None. Move to new file position. 

、明示的に、バックあなたはf.seek(0)をしたいファイルの先頭に取得します。

何が起こっているかの例を示すためです。ここでは切り捨てと何が起こるかです:

ファイルは、その中のものがあります。

>>> with open('v.txt') as f: 
... res = f.read() 
... 
>>> print(res) 
1 
2 
3 
4 

コールtruncateをし、そのファイルが空になります参照してください。

>>> with open('v.txt', 'r+') as f: 
... f.truncate(0) 
... 
0 
>>> with open('v.txt', 'r') as f: 
... res = f.read() 
... 
>>> print(res) 

>>> 

f.seek(0)使用:

>>> with open('v.txt') as f: 
... print(f.read()) 
... print(f.read()) 
... f.seek(0) 
... print(f.read()) 
... 
1 
2 
3 
4 



0 
1 
2 
3 
4 


>>> 

最初の出力間の長いギャップは、ファイルの最後にカーソルを表示します。次にf.seek(0)と呼びます(0の出力はf.seek(0)のコールです)。f.read()を出力します。

1

あなたはf.seek(0)

with open("example.json", "r+") as f: 
    data = json.load(f) 
    # perform modifications to data 
    f.seek(0); 
    f.truncate(0) 
    json.dump(data, f) 
関連する問題