Python删除JSON字段报'str'对象无pop/del属性错误如何解决
错误原因
- 遍历字典的逻辑错误:直接
for element in data迭代Python字典时,拿到的是字典的顶层键,也就是字符串"collections",不是键对应的嵌套字典值。后续对字符串做循环、调用字典专属的pop()方法,自然会抛出AttributeError: 'str' object has no attribute ...错误。 - 层级定位错误:原代码完全没有深入到
collections -> tags这个目标节点,根本碰不到需要修改的标签对象。 - 存在两处细节笔误:一是待删除的属性名写错,目标属性是前后带双下划线的
__collections__,原代码写的是单下划线开头的_collections;二是最后写文件时,json.dump()传入的文件句柄是之前已经关闭的读模式句柄f,不是新打开的写模式句柄data_file,就算前面逻辑对也会写文件失败。
修正后的代码
import json # 读取原始JSON内容 with open('jsontest.json', 'r', encoding='utf-8') as f: data = json.load(f) # 定位到tags节点下的所有标签对象 for tag_obj in data['collections']['tags'].values(): # 删除不需要的属性,传入None作为默认值,属性不存在时也不会报错 tag_obj.pop('id', None) tag_obj.pop('__collections__', None) # 将修改后的数据写回文件 with open('jsontest.json', 'w', encoding='utf-8') as data_file: # indent=2 输出带缩进的格式化JSON,和你期望的结构格式一致 # ensure_ascii=False 避免中文等非ASCII字符被转义 json.dump(data, data_file, indent=2, ensure_ascii=False)
代码说明:
data['collections']['tags']本身是一个字典,键是类似2GvAB3TrWwJSdDeAdg4R的随机ID,值就是你要修改的标签属性对象,所以直接遍历.values()拿到所有标签对象做处理即可,不需要额外循环外层无关节点。
内容的提问来源于stack exchange,提问作者AMM
相关产品推荐
相关产品推荐

