处理JSON时报TypeError: list indices must be integers or slices, not str如何修复
报错原因
- 你生成的
data是列表类型:通过列表推导式逐行加载JSON后,每个完整的JSON对象是data的子元素,直接用字符串键k访问列表data[k]不符合Python语法,触发类型错误 - 逻辑层级混淆:你遍历的是第一个JSON对象
data[0]的键值对,后续取值、修改操作的对象应该是data[0][k],不是顶层的data
适配原需求的修复代码
如果你确定JSON中带$的字段都只有一层嵌套、且每行对应一个JSON对象,可以直接修改原有逻辑:
import json with open('C:\\Windows\\System32\\files\\news.json', 'r', encoding="utf8") as handle: data = [json.loads(line) for line in handle] # 遍历列表内的每一个JSON对象 for obj in data: for k, v in obj.items(): if isinstance(v, dict): # 遍历当前字典的所有键,判断是否带$ for sub_k in list(v.keys()): if sub_k.startswith('$'): # 直接把值上提一层覆盖原字段 obj[k] = v[sub_k] break print(data)
通用递归版本(支持任意层级带$的字段清理)
如果后续可能出现多层嵌套的带$字段,建议用递归逻辑适配所有场景:
import json def clean_dollar_fields(obj): if isinstance(obj, dict): new_obj = {} for k, v in obj.items(): if k.startswith('$'): # 遇到$开头的键直接返回清理后的值,不上提键名 return clean_dollar_fields(v) new_obj[k] = clean_dollar_fields(v) return new_obj elif isinstance(obj, list): return [clean_dollar_fields(item) for item in obj] else: return obj with open('C:\\Windows\\System32\\files\\news.json', 'r', encoding="utf8") as handle: data = [clean_dollar_fields(json.loads(line)) for line in handle] print(data)
内容的提问来源于stack exchange,提问作者n.mathfreak
相关产品推荐
相关产品推荐

