更新 json 文件中的键值,维护文件完整性,Python 3

Update key values in file of json, maintain file integrity, Python 3

提问人:noydb 提问时间:9/16/2022 更新时间:9/16/2022 访问量:29

问:

我有包含 ~35k 行的文件,我只需要更改键 base1 中某些项目的值,如下所示。我需要更改 id 和 title 值并保存相同的文件。比如,title 变成“title abc”,id 变成“789”。

例如,之前:

  "base1": {
    "base1base2": [
      {
        "id": "123",
        "title": "title xyz",
        "visibility": true
      }
    ],
    "title": "title xyz"
  }

经过一些研究和反复试验,下面这奏效了。我做了与下面类似的操作(没有缩进),但是当我预计文件大小几乎没有变化(如果有的话)时,我的文件大小减少了一半。格式化消失了。我看到有人建议添加缩进部分,如下所示,所以我这样做了,但是文件大小比我预期的要大一些,并且添加了大量的空格和\n。

wmjf = 'webmap.json'

with open(wmjf, "r") as jf:
   data = json.load(jf)
   data['base1']['base1base2'][0]['id'] = '789'
   data['baseMap']['baseMapLayers'][0]['title'] = 'title abc'
   data['baseMap']['title'] = 'title abc'
    
with open(wmjf, "w") as jf:
  json.dump(json.dumps(data, indent=4), jf)

jf.close()

在进行这些非常小的值更改时,我能否获得一些帮助,了解我在保持文件原样方面做错了什么,它是完整性。我想知道下面的结果是否真的适合我需要的东西(这将大小减小了一半,没有格式,但我怀疑它可能适用于重新发布 - 很快就会根据响应尝试)

with open(wmjf, "w") as jf:
   json.dump(data, jf)

而且,这段代码是好的、正确的、pythonic的吗?我不是开发人员,这些年来只需要在这里和那里做一些小脚本,所以我很感激我的尝试,谢谢!此外,我看到一些类似问题的答案,使用开放模式 r+ 或 w+ -- + 是什么意思?

蟒蛇 JSON

评论

0赞 Barmar 9/16/2022
您的原始文件每个级别有 2 个缩进空间,因此请使用indent=2
1赞 Barmar 9/16/2022
你为什么关心格式?
0赞 noydb 9/16/2022
2 缩进仍然增加了大量空格和\n,但文件大小仅减少了四分之一。而且,事实上,也许我不需要关心格式。今天晚些时候会尝试。这是重新发布到 Web 的 webmap json,将尝试不进行格式设置,看看是否有效。
0赞 Barmar 9/16/2022
您在顶部显示的原始格式有空格和换行符,这和 .indent=2
1赞 Barmar 9/16/2022
哦,现在我明白了。问题是你同时调用了 和 。只做一个或另一个,而不是两者兼而有之。json.dumpjson.dumpsjson.dump(data, jf, indent=2)

答:

0赞 Barmar 9/16/2022 #1

您不需要同时调用 和 。您需要将数据转换为 JSON,然后将该 JSON 转换为另一个 JSON 字符串,以便第一个 JSON 中的换行符在文件中转换为。json.dump()json.dumps()\n

只需调用并指定那里的缩进即可。json.dump()

with open(wmjf, "w") as jf:
  json.dump(data, jf, indent=2)