2017-02-17 1 views
1

json.dump()で予期しない動作が発生しています。私は、ファイルresults(空)を作成し、このようなコードでそれを使用しています:json.dump()はファイルに追加されますか?

 with open(results, 'r+') as fp: 
      temp = {} 
      try: 
       # file not empty, load existing dict, and add a key value to it 
       temp = json.load(fp) 
       temp[key] = value 
      except json.decoder.JSONDecodeError: 
       # file is empty, create a new dict 
       temp[key] = value 
      # write the dictionary back into file 
      json.dump(temp, fp) 

上記の引用は、一度実行した場合、それが正常に動作します。ただし、2回実行すると、2つのキー({key1: value1, key2: value2})を持つ1つの辞書が必要になりますが、代わりに2つの辞書:{key1: value1}{key2: value2}が得られます。そのような行動の理由は何でしょうか?

答えて

4

コード実行前と実行後に出力ファイルを調べると、何が起こっているのかがわかるはずです。

json.dumpの直前で、ファイルオブジェクトはファイルの末尾を指します。この位置からデータをダンプします。

あなたが最初のファイルを巻き戻してみた場合、それは最初からデータを上書きする必要があります

fp.seek(0) 
json.dump(temp, fp) 

それがすでにあるよりも少ないデータの書き込みを行う場合は、これは潜在的に、最初のオブジェクトを超えてデータをダングリング残すことができますファイル。したがって、私はあなたのコードを2つの操作で読み書きするように再構築することを提案し、書き込み時にファイルを消去します。例:

関連する問題