如何用python更新json文件
我试图更新现有的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",
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()
对于所有的更新都足够了吗?Doesjson.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()