【问题标题】:Update json file更新 json 文件
【发布时间】:2013-03-14 17:06:13
【问题描述】:

我有一个包含一些数据的 json 文件,并且想偶尔更新这个文件。

我读了文件:

with open('index.json', 'rb') as f:
    idx = json.load(f)

然后从潜在的新数据中检查是否存在密钥,如果密钥不存在则更新文件:

with open('index.json', mode='a+') as f:
    json.dump(new_data, f, indent=4)

但是这个过程只是创建新的 json 对象(python dict)并将其作为新对象附加到输出 json 文件中,使文件不是有效的 json 文件。

有没有简单的方法通过更新初始字典将新数据附加到 json 文件而不覆盖整个文件?

【问题讨论】:

  • 'w'模式打开文件,而不是追加+写入模式..
  • 是否有实际理由不重写整个文件?这听起来可能会变得丑陋。另外,底层文件不支持“插入”操作,所以如果你的更新接近开始,你至少必须重写文件的其余部分。
  • @Martijn Pieters:这将覆盖文件(初始数据),我使用 append 因为我想附加数据。
  • @theta:这不是它的工作原理;您可能通过附加更新了 JSON 结构,但文件不是一回事。你需要重写它。

标签: python json


【解决方案1】:

一种方法是在文件中的每一行写入一个 JSON 对象。我正在使用这种方法,并且效果很好。

一个很好的好处是您可以更有效地读取文件(内存方面),因为您可以一次读取一行。如果你需要所有这些,在 Python 中组装一个列表没有问题,但如果你不需要,你的操作速度会更快,你也可以追加。

因此,要开始编写所有对象,您需要执行以下操作:

with open(json_file_path, "w") as json_file:
    for data in data_iterable:
        json_file.write("{}\n".format(json.dumps(data)))

然后高效读取(无论文件大小,都会消耗很少的内存):

with open(json_file_path, "r") as json_file:
    for line in json_file:
        data = json.loads(line)
        process_data(data)

更新/追加:

with open(json_file_path, "a") as json_file:
    json_file.write("{}\n".format(json.dumps(new_data)))

希望这会有所帮助:)

【讨论】:

  • 感谢@kgr,这似乎是个不错的把戏。我认为这样缩进是不可能的。
  • @theta - 不客气。是的,如果您每行存储一个对象,则不可能在文件中漂亮打印(缩进)JSON。不过,您可以在每个 JSON 对象之后添加一些标记,并使用它来区分一个对象的结束位置和另一个对象的开始位置(这里 \n 就是这样一个标记,它也起着特殊的作用)。做对会更棘手,但肯定是可能的。这样你就可以在文件中缩进,因为换行符会被忽略。整个想法不是在文件中包含一个 JSON 对象,而是多个,以便您可以在需要时以一种有效的方式添加更多...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2016-09-29
  • 2019-04-08
相关资源
最近更新 更多