如何用python更新json文件

如何用python更新json文件,python,json,Python,Json,我试图更新现有的Json文件,但出于某种原因,请求的值没有被更改,而是整个值集(带有新值)被追加到原始文件中 jsonFile = open("replayScript.json", "r+") data = json.load(jsonFile) tmp = data["location"] data["location"] = "NewPath" jsonFile.write(json.dumps(data)) 结果是: 所需: { "location": "NewPath",

我试图更新现有的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"
}
实际:

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

这里的问题是,您打开了一个文件并读取了它的内容,所以光标位于文件的末尾。通过写入同一个文件句柄,实质上就是附加到文件

最简单的解决方案是在读入文件后将其关闭,然后重新打开以进行写入

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)
或者,您可以使用将光标移回文件的开头,然后开始写入,然后使用a来处理新数据小于前一个数据的情况

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

    data["location"] = "NewPath"

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

感谢您解释
seek()
truncate()
的用法。不过,我会通过将
jsonFile.write(json.dumps(data))
更改为
jsonFile.dump(data,f)
,来改进这个答案;更像pythonic。如果我正在更新多个位置,例如
data[“location_2”]=“NewPath_2”
,我应该执行
jsonFile.seek(0);dump();truncate()
也可以或仅执行单个
jsonFile.seek(0);dump(数据,jsonFile);jsonFile.truncate()
对于所有的更新都足够了吗?Does
json.dump(data,jsonFile);jsonFile.truncate()
只更新文件的更新部分,还是重新写入完整的文件@在第二个例子中,
tmp=data[“location”]
似乎是多余的;它应该被移除。此外,我还使用了`json.dump(data,jsonFile,indent=4)`来触发pretty print,这样json文件布局就不会是紧凑型的。难道没有办法只更新一个json字段,而不必重写整个文件吗?我只是在玩它,结果弄乱了整个文件。我很好奇,tmp变量需要什么?将其传递给tmp=data['location]与直接传递给data['location']路径有什么区别吗?我想这只是一个示例,说明了“处理缓冲内容”的工作原理,正如注释所述。
with open("replayScript.json", "r+") as jsonFile:
    data = json.load(jsonFile)

    data["location"] = "NewPath"

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