【问题标题】:How to update json file with python如何用python更新json文件
【发布时间】:2012-12-06 15:25:57
【问题描述】:

我正在尝试更新现有的 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": ""
}

【问题讨论】:

    标签: python json


    【解决方案1】:

    这里的问题是您打开了一个文件并读取了它的内容,因此光标位于文件的末尾。通过写入同一个文件句柄,您实际上是在追加文件。

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

    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)
    

    或者,您可以使用seek() 将光标移回文件开头然后开始写入,然后使用truncate() 来处理新数据小于前一个数据的情况。

    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) ; json.dump(data, jsonFile); jsonFile.truncate() 以完成所有更新就足够了?
    • json.dump(data, jsonFile); jsonFile.truncate() 是只更新文件的更新部分还是重新写入完整的文件? @Shawn Chin
    • 在第二个例子中,tmp = data["location"] 似乎是多余的;它应该被删除。另外,我使用了`json.dump(data, jsonFile, indent=4)`来触发pretty-print,这样json文件布局就不会是compact类型了。
    • 有没有办法只更新单个json字段,而不必重写整个文件?我只是在玩它,结果弄乱了整个文件。
    【解决方案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()
    

    【讨论】:

    • 我很好奇,tmp 变量需要什么?将它传递给 tmp = data['location] 与直接传递给 data['location'] 路径有什么区别吗?
    • 我想这只是一个例子,展示了“使用缓冲内容”如何工作的可能性,正如评论所述。
    猜你喜欢
    • 2014-08-26
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多