在Python中编辑包含新信息的JSON文件

2024-04-20 13:43:22 发布

您现在位置: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
    }
  ]
}

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


Tags: 文件数据对象代码信息编辑内容metadata
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()

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

相关问题 更多 >