JSON 添加不必要的花括号

时间:2021-04-11 19:52:57

标签: python json python-3.x

我正在使用 Discord.py 创建一个 Discord 机器人。我创建了一个命令,该命令将使用用户指定的值更新外部 JSON 文件。在测试该命令时,我注意到某些单词(例如 tes)会在 JSON 文件的末尾添加一个不必要的花括号。这个问题只出现在某些单词上,大多数工作没有任何问题。

Python 文件

import json
with open("./file.json", "r+") as file:
    f = json.load(file)
    file.truncate()
    f["key"] = "tes"
    file.seek(0)
    json.dump(f, file, indent = 4)

JSON 文件

{
"key": "tes"
}
}

我尝试使用 f.update({"key": "tes"}) 但没有区别。

编辑: 通过将 file.truncate() 移到 file.seek(0)

下方解决了问题

2 个答案:

答案 0 :(得分:0)

所以 - 我知道你已经开始工作了,但是你的 file.truncate()file.truncate() 有点黑魔法,并且没有被经常使用,这会使你的代码不那么惯用,而且更加困难维护。

我认为如果您使用单独的文件句柄来读取和写入文件会更清晰。

filename = './file.json'
with open(filename) as fp:
    jsonstuff = json.load(fp)

jsonstuff['key'] = 'tes'
with open(filename, "w") as fp:
    json.dump(jsonstuff, fp, indent=4)

答案 1 :(得分:0)

当你不带参数调用 file.truncate() 时,它是 truncates the file at the current location(文件的结尾)。然后当您调用 file.seek(0) 时,它移动到文件的开头并开始在旧数据之上写入新数据。如果新内容比旧内容短(例如,将“test”字符串替换为“tes”),则最后会留下一些旧内容。以下是几种解决方案:

  • 将当前的 file.truncate() 更改为 file.truncate(0)
  • 在写入文件之前使用 file.seek(0),然后立即使用 file.truncate() 或在您完成将数据写入文件之后
  • 使用 open(filename, 'r') 块读取文件,然后使用单独的 open(filename, 'w') 块写回文件(自动替换完整内容)