2016-05-13 10 views
4

AWS S3からboto3を使用してファイルをダウンロードしています。これは基本的なJSONファイルです。Python 2.7のファイル記述子が正しくありません

{ 
    "Counter": 0, 
    "NumOfReset": 0, 
    "Highest": 0 
} 

私は、JSONファイルを開くことができますが、私はいくつかの値を変更した後、同じファイルに戻ってそれをダンプするために行くとき、私はIOError: [Errno 9] Bad file descriptorを取得します。

with open("/tmp/data.json", "rw") as fh: 
    data = json.load(fh) 
    i = data["Counter"] 
    i = i + 1 
    if i >= data["Highest"]: 
     data["Highest"] = i 
    json.dump(data, fh) 
    fh.close() 

間違ったファイルモードを使用しているのですか、これは間違っていますか?

+1

ファイルを開いて情報を読み込み、変更してからファイルを開いて書き出します。 – Keozon

+1

'rw'は存在しません。あなたは 'r +'を探しています。 –

答えて

6

2つのもの。そのr+rwではなく、以前のデータを上書きする場合は、fh.seek(0)を使用してファイルの先頭に戻る必要があります。それ以外の場合は、変更されたJSON文字列が追加されます。

with open("/tmp/data.json", "r+") as fh: 
    data = json.load(fh) 
    i = data["Counter"] 
    i = i + 1 
    if i >= data["Highest"]: 
     data["Highest"] = i 

    fh.seek(0) 
    json.dump(data, fh) 
    fh.close() 

ただし、データが部分的にしか上書きされないことがあります。だから、wでファイルを閉じてもう一度開くのは良い考えです。

with open("/tmp/data.json", "r") as fh: 
    data = json.load(fh) 

i = data["Counter"] 
i = i + 1 
if i >= data["Highest"]: 
    data["Highest"] = i 

with open("/tmp/data.json", "w") as fh: 
    json.dump(data, fh) 
    fh.close() 

fh.close()する必要はありません、それはwith .. asが何のためにあるのかです。

+0

ああ...うーん。ありがとう! – mxplusb

関連する問題