99 votes

Comment mettre à jour un fichier json avec python ?

J'essaie de mettre à jour un 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 : Requis :

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

170voto

Shawn Chin Points 29756

Le problème ici est que vous avez ouvert un fichier et lu son contenu, de sorte que le curseur se trouve à la fin du fichier. En écrivant sur le même gestionnaire 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)

data["location"] = "NewPath"

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

Alternativement, vous pouvez utiliser seek() pour ramener le curseur au début du fichier et commencer à écrire, suivi d'une touche truncate() pour 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)

    data["location"] = "NewPath"

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

51voto

Igal Points 464
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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X