我在json.dump()中遇到了一些意想不到的行为。我正在创建一个文件results
(空),然后在代码中使用它:
with open(results, 'r+') as fp:
temp = {}
try:
# file not empty, load existing dict, and add a key value to it
temp = json.load(fp)
temp[key] = value
except json.decoder.JSONDecodeError:
# file is empty, create a new dict
temp[key] = value
# write the dictionary back into file
json.dump(temp, fp)
如果以上引用执行一次,则可以正常工作。但是,如果我执行两次,我希望有一个包含两个键的字典:{key1: value1, key2: value2}
,但我得到两个词典:{key1: value1}{key2: value2}
。这种行为可能是什么原因?
答案 0 :(得分:5)
在运行代码之前和之后查看输出文件,你应该看看发生了什么。
在json.dump
之前,文件对象指向文件的末尾。然后从这个位置转储数据。
如果您首先尝试倒回文件,它应该从开头覆盖数据:
fp.seek(0)
json.dump(temp, fp)
但是,如果数据写入的数据少于文件中已有的数据,则可能会使悬空数据超出第一个对象。因此,我建议您重新构建代码,以便在两次操作中读取和写入文件,在写入时擦除文件。例如:
import json
filename = "foo"
print("Reading %s" % filename)
try:
with open(filename, "rt") as fp:
data = json.load(fp)
print("Data: %s" % data)
except IOError:
print("Could not read file, starting from scratch")
data = {}
# Add some data
data["key2"] = "value2"
print("Overwriting %s" % filename)
with open(filename, "wt") as fp:
json.dump(data, fp)
答案 1 :(得分:0)
这取决于您如何打开文件。 如果您通过
指定“ w”with open(filename, "w") as f:
json.dump(data,f)
先前的数据将被覆盖。但是,如果您是“ a”或“ a +”
with open(filename, "a") as f:
json.dump(data,f)
它将附加新数据。