【问题标题】:Deleting sub-element from JSON file从 JSON 文件中删除子元素
【发布时间】:2020-09-18 13:57:09
【问题描述】:

我认为从 JSON 嵌套字典中删除一个键很简单,但我最终得到了错误。 我有如下所示的 JSON 文件,并想从其元素 "Codes" 中删除一个键 "8888"。

dummy.json:

{
    "Codes": {
        "8888": "code1|18888",
        "9999": "code2|19999",
        "7777": "code3|17777"
    },
    "Names": {
        "Site1": "Site1|18888",
        "Site2": "Site2|19999",
        "Site3": "Site3|17777"
    }
}

Python 代码:

import json

with open('dummy.json') as json_data:
    data = json.load(json_data)
    for element in data["Codes"]:
        #del element['8888']
        element.pop('8888', None)

with open('dummy.json'), 'w') as outfile:  
    json.dump(data, outfile)

结果:

第一次尝试,我尝试了del element['8888'],它抛出了TypeError: 'str' object does not support item deletion

根据示例找到here,我尝试使用element.pop('8888', None) 并抛出AttributeError: 'str' object has no attribute 'pop' 错误。

我不知道我做错了什么,请帮忙。

【问题讨论】:

  • ...您是否再次保存数据?你好像没有。
  • @Tomalak,感谢您的回复,我添加了下一段代码以再次将数据写入 JSON 文件,但我认为这没有必要,因为我的代码在弹出/删除元素级别失败。 . 如果我误解了你的问题,请澄清。
  • 读取文件后你有什么样的数据结构?重点是,您的问题与 JSON 无关,而是与使用该数据结构有关!

标签: python json


【解决方案1】:

在迭代 data["Codes"] 时,element 将成为 data["Codes"] 字典的键,它是一个字符串,没有 pop 函数(只能应用于 dicts)。

试试吧:

import json
with open('dummy.json') as json_data:
    data = json.load(json_data)
    data["Codes"].pop("8888")

with open('dummy.json', 'w') as outfile:  
    json.dump(data, outfile)

【讨论】:

    【解决方案2】:

    试试这个:

    with open('test.json') as fp:
        data = json.loads(fp.read())
        del data['Codes']['8888']
    

    【讨论】:

      【解决方案3】:

      在for element in data["Codes"] 循环中,元素将是data["Codes"] 字典的键。所以如果打印data["Codes"]的所有元素,结果是这样的。

      for element in data["Codes"]:
          print(element)
      >>> 8888
      >>> 9999
      >>> 7777
      

      你不需要 for 循环。如果你想删除(或弹出)data["Codes"] 的某个键,就这样做。

      data["Codes"].pop("8888", None)
      

      【讨论】:

        猜你喜欢
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多