2012-12-19 5 views
22

私は既存のJsonファイルを更新しようとしていますが、何らかの理由で要求された値が変更されていませんが、新しい値を持つ値のセット全体が元のjsonファイルをPythonで更新する方法

jsonFile = open("replayScript.json", "r+") 
data = json.load(jsonFile) 


tmp = data["location"] 
data["location"] = "NewPath" 

jsonFile.write(json.dumps(data)) 

を提出し、その結果は次のとおりです。 必須:実際

{ 
    "location": "NewPath", 
    "Id": "0", 
    "resultDir": "", 
    "resultFile": "", 
    "mode": "replay", 
    "className": "", 
    "method": "METHOD" 
} 

{ 
"location": "/home/karim/storm/project/storm/devqa/default.xml", 
"Id": "0", 
"resultDir": "", 
"resultFile": "", 
"mode": "replay", 
"className": "", 
"method": "METHOD" 
} 
{ 
    "resultDir": "", 
    "location": "pathaaaaaaaaaaaaaaaaaaaaaaaaa", 
    "method": "METHOD", 
    "className": "", 
    "mode": "replay", 
    "Id": "0", 
    "resultFile": "" 
} 

答えて

19
def updateJsonFile(): 
    jsonFile = open("replayScript.json", "r") # Open the JSON file for reading 
    data = json.load(jsonFile) # Read the JSON into the buffer 
    jsonFile.close() # Close the JSON file 

    ## Working with buffered content 
    tmp = data["location"] 
    data["location"] = path 
    data["mode"] = "replay" 

    ## Save our changes to JSON file 
    jsonFile = open("replayScript.json", "w+") 
    jsonFile.write(json.dumps(data)) 
    jsonFile.close() 
38

ここで問題となるのは、ファイルを開いてその内容を読み込んで、カーソルがファイルの最後にあることです。同じファイルハンドルに書き込むことで、基本的にファイルに追加されます。

最も簡単な解決策は、ファイルを読み込んだ後にファイルを閉じてから、書き込み用に再度開くことです。また

with open("replayScript.json", "r") as jsonFile: 
    data = json.load(jsonFile) 

tmp = data["location"] 
data["location"] = "NewPath" 

with open("replayScript.json", "w") as jsonFile: 
    json.dump(data, jsonFile) 

、新しいデータが以前よりも小さい場合に対処するためにtruncate()、続いて書き始める戻しファイルの先頭にカーソルを移動するためにseek()を使用することができます。

with open("replayScript.json", "r+") as jsonFile: 
    data = json.load(jsonFile) 

    tmp = data["location"] 
    data["location"] = "NewPath" 

    jsonFile.seek(0) # rewind 
    json.dump(data, jsonFile) 
    jsonFile.truncate() 
+4

'seek()'と 'truncate()'の使用について説明していただきありがとうございます。しかし、私は 'jsonFile.write(json.dumps(data))'を 'jsonFile.dump(data、f)'に変更することでこの答えを改善するだろう。より多くのpythonic。 – BoltzmannBrain

関連する問題