Как обновить json файл с помощью python
Я пытаюсь обновить существующий Json файл, но по какой-то причине запрошенное значение не изменяется, но весь набор значений (с новым значением) добавляется к исходному файлу
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"
}
Actual:
{
"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": ""
}
Ответы
Ответ 1
Проблема здесь в том, что вы открыли файл и прочитали его содержимое, чтобы курсор находился в конце файла. При записи в один и тот же дескриптор файла вы по существу добавляете файл.
Самое простое решение - закрыть файл после его чтения, а затем снова открыть его для записи.
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)
В качестве альтернативы вы можете использовать seek()
, чтобы переместить курсор обратно в начало файла, а затем начать запись, а затем truncate()
, чтобы обработать случай, когда новые данные меньше предыдущего.
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()
Ответ 2
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()