【问题标题】:Editing a JSON file with new information in Python在 Python 中使用新信息编辑 JSON 文件
【发布时间】:2019-08-16 07:50:37
【问题描述】:

我正在尝试使用 python 脚本生成的新信息编辑元文件,并且不想只是将信息附加到新的 JSON 对象,而是更新读取的信息。

作为输入,我有这样的内容:

{
    "foo1": [
    {
      "bar1": 0,
      "bar2": 1337
    },
    ...
}

到目前为止,我的代码读取信息并将其存储在字典中。之后,此文件中的信息将被删除并替换为更新的字典。代码如下:

...
outputData = {"foo2": [{"bar3": True, "bar4": 123}]}
with open(metaFile, 'r+') as f:
    metaData = json.load(f)
    f.seek(0)
    f.truncate()
    metaData.update(outputData)
    f.write(json.dumps(metaData, indent=2))
    f.close()
...

结果如预期的那样:

{
    "foo1": [
    {
      "bar1": 0,
      "bar2": 1337
    }
  ],
    "foo2":[
    {
      "bar3": true,
      "bar4": 123
    }
  ]
}

现在我的确切问题是,是否可以以这样的方式编辑文件,文件中的内容不会首先被删除并再次写入?因为如果在初始化之后元数据发生了什么事,信息就消失了。 将 'r+' 参数更改为 'w+' (+ 是可选的)将创建一个新文件,而不是先从它读取,此时整个数据都消失了。使用“a”,输出数据不能更新然后添加,因为它会重写已经给定的信息。如果不更新元数据,它只会创建一个新对象,这不是我的想法。

【问题讨论】:

  • 可能是这样:写入新文件,删除旧文件,重命名?那么如果在此过程中发生某些事情,您仍然会拥有旧文件/新文件

标签: python json file


【解决方案1】:

在您的情况下,如果您确定更改后的文件大小将始终等于或大于文件中当前的大小,您可以直接致电f.write(data)。 这样,您不必在写入文件之前截断(并丢失)文件。

此外,当您使用with 语法打开文件时,一旦 with 块结束,它将自动关闭。

最后你的代码看起来像这样:

outputData = {"foo2": [{"bar3": True, "bar4": 123}]}
with open(metaFile, 'r+') as f:
    metaData = json.load(f)
    f.seek(0)
    metaData.update(outputData)
    f.write(json.dumps(metaData, indent=2))
# rest of your code with the normal identation level

【讨论】:

    【解决方案2】:

    您可以编写如下代码,也可以使用 MongoDB。

    outputData = {"foo2": [{"bar3": True, "bar4": 123}]}
    with open(metaFile, 'r+') as fp:
        origin = fp.read()
        target = json.dumps(dict(json.loads(origin), **outputData), indent=2)
        index = [i for i, (a, b) in enumerate(zip(origin, target)) if a != b][0]
        fp.seek(index)
        fp.truncate()
        fp.write(target[index:])
        fp.close()
    

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2021-11-22
      • 2018-07-18
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2021-09-04
      相关资源
      最近更新 更多