web-dev-qa-db-fra.com

Comment mettre à jour le fichier json avec python

J'essaie de mettre à jour le fichier Json existant, mais pour une raison quelconque, la valeur demandée n'est pas modifiée, mais l'ensemble des valeurs (avec la nouvelle valeur) est ajouté au fichier d'origine.

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


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

jsonFile.write(json.dumps(data))

et le résultat est: Obligatoire:

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

Réel:

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

Le problème ici est que vous avez ouvert un fichier et lu son contenu afin que le curseur se trouve à la fin du fichier. En écrivant dans le même descripteur de fichier, vous ajoutez essentiellement au fichier.

La solution la plus simple serait de fermer le fichier après l'avoir lu, puis de le rouvrir pour l'écrire.

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)

Vous pouvez également utiliser seek() pour déplacer le curseur au début du fichier, puis commencer à écrire, suivi de truncate() = traiter le cas où les nouvelles données sont plus petites que les précédentes.

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()
74
Shawn Chin
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()
34
Igal