如何使用python更新json文件

Iga*_*gal 53 python json

我正在尝试更新现有的Json文件,但由于某种原因,请求的值没有被更改,但是整个值集(带有新值)被附加到原始文件

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


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

jsonFile.write(json.dumps(data))
Run Code Online (Sandbox Code Playgroud)

结果是:必需:

{
   "location": "NewPath",
   "Id": "0",
   "resultDir": "",
   "resultFile": "",
   "mode": "replay",
   "className":  "",
   "method":  "METHOD"
}
Run Code Online (Sandbox Code Playgroud)

实际:

{
"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": ""
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*hin 83

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

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

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)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用seek()将光标移回文件的开头然后开始写入,然后使用a 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()
Run Code Online (Sandbox Code Playgroud)

  • 感谢您解释`seek()`和`truncate()`的用法.然而,我会通过将`jsonFile.write(json.dumps(data))`更改为`jsonFile.dump(data,f)`来改进这个答案.更pythonic. (7认同)
  • 如果我还要更新多个位置,例如 `data["location_2"] = "NewPath_2"`,我是否应该执行 `jsonFile.seek(0); 倾倒(); truncate()` 也或只执行单个 `jsonFile.seek(0) ;json.dump(data, jsonFile); jsonFile.truncate()` 在所有更新的末尾就足够了吗? (2认同)
  • 做`json.dump(data, jsonFile); jsonFile.truncate()` 仅更新文件上的更新部分还是重新写入完整的文件?@肖恩钦 (2认同)

Iga*_*gal 35

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()
Run Code Online (Sandbox Code Playgroud)

  • 我很好奇,tmp变量需要什么?将它传递给tmp = data ['location]与直接数据['location']路径有区别吗? (7认同)
  • 我想这只是一个例子来展示“使用缓冲内容”如何工作的可能性,正如评论所述。 (2认同)