我正在使用 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)
答案 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')
块写回文件(自动替换完整内容)