json.dump()是否附加到文件?

时间:2017-02-17 12:01:21

标签: python json

我在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}。这种行为可能是什么原因?

2 个答案:

答案 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)

它将附加新数据。

参考:Python open()