2012-12-19 4 views
22

Ich versuche, vorhandene Json-Datei zu aktualisieren, aber aus irgendeinem Grund wird der angeforderte Wert nicht geändert, aber die gesamte Gruppe von Werten (mit dem neuen Wert) wird an das Original angefügt DateiWie update Json-Datei mit Python

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


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

jsonFile.write(json.dumps(data)) 

und das Ergebnis ist: erforderlich:

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

Aktuell:

{ 
"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": "" 
} 

Antwort

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

Das Problem hier ist, dass Sie eine Datei geöffnet haben und ihren Inhalt lesen, so dass sich der Cursor am Ende der Datei befindet. Wenn Sie in dasselbe Datei-Handle schreiben, fügen Sie im Wesentlichen die Datei hinzu.

Die einfachste Lösung wäre, die Datei nach dem Einlesen zu schließen und sie dann zum Schreiben wieder zu öffnen.

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) 

Alternativ können Sie seek() verwenden Sie den Cursor an den Anfang der Datei zu schreiben, dann beginnen sich zu bewegen, gefolgt von einem truncate() mit dem Fall zu befassen, wo die neuen Daten kleiner als die vorherige ist.

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

Vielen Dank für die Verwendung von 'seek()' und 'truncate()'. Ich würde diese Antwort jedoch verbessern, indem ich 'jsonFile.write (json.dumps (Daten))' in 'jsonFile.dump (Daten, f)' ändere; mehr pythonisch. – BoltzmannBrain