繁体   English   中英

使用Python编辑带有新信息的JSON文件

[英]Editing a JSON file with new information in Python

我正在尝试使用由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
    }
  ]
}

现在我确切的问题是,是否可以通过这种方式编辑文件,使得文件中的内容不会首先被删除并再次写入? 因为如果初始化后metaData发生了某些事情,那么信息就消失了。 将“ r +”参数更改为“ w +”(+是可选的)将创建一个新文件,而不是先读取该文件,此时所有数据都消失了。 使用'a'不能更新然后再添加outputData,因为它将重写已经给定的信息。 如果不更新metaData,它将仅创建一个新对象,而这并不是我的初衷。

在您的情况下,如果您确定更改后的文件大小将始终等于或大于文件中当前的大小,则可以直接调用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

您可以按照以下方式进行编码,也可以使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM