为何脚本内直接定义的列表可用json_normalize,读取文件数据却报错?
为什么从JSON文件读取数据后使用pd.json_normalize会报KeyError: 'componentes_kit'?
问题重现
直接使用内存中的字典变量时,代码可正常执行:
# 脚本1(正常运行) df_= resp['produto_servico_cadastro'] df_1 = pd.json_normalize(df_, record_path = ['componentes_kit'])
但将数据保存为JSON文件后读取执行相同操作,触发KeyError: 'componentes_kit':
# 脚本2(报错) f = open('/content/data.json') dft = json.load(f)['produto_servico_cadastro'] dft_1 = pd.json_normalize(dft, record_path=['componentes_kit'])
原数据结构示例:
resp = {"pagina": 1, "total_de_paginas": 3, "registros": 500, "total_de_registros": 1052, "produto_servico_cadastro": [{"aliquota_cofins":0, "aliquota_ibpt":0, "aliquota_icms":0, "aliquota_pis":0, "altura":5, "bloqueado":"N", "bloquear_exclusao":"N", "cest":"", "cfop":"", "codInt_familia":"", "codigo":"10", "codigo_beneficio":"", "codigo_familia":3250197559, "codigo_produto":3250200206, "codigo_produto_integracao":"8531613751", "componentes_kit":[ { "codigo_componente":3323761053, "codigo_produto_componente":3250202406, "local_estoque_componente":3244295942, "quantidade_componente":1, "valor_unitario_componente":13.1 }, { "codigo_componente":3253472053, "codigo_produto_componente":3250202411, "local_estoque_componente":3244295942, "quantidade_componente":1, "valor_unitario_componente":13.1 }]}]}
问题原因
最常见的原因是JSON文件保存方式错误:
你可能直接将带有resp = 前缀的Python代码复制保存为了JSON文件,而非纯JSON格式的数据。JSON格式不允许变量赋值语句,当json.load()读取这种非标准内容时,要么解析失败,要么解析后的结构与原字典完全不符——比如读取后produto_servico_cadastro中的元素缺失componentes_kit字段,或者整个数据结构被破坏。
另一种可能是保存JSON时部分数据被意外修改或截断,但脚本1能正常运行,说明原内存数据是完整的,因此前者的概率更高。
解决方案
- 正确保存JSON文件:使用Python的
json.dump()方法将字典写入文件,确保生成标准JSON格式:
import json # 正确保存resp字典为JSON文件 with open('/content/data.json', 'w', encoding='utf-8') as f: json.dump(resp, f, ensure_ascii=False, indent=2)
检查并修复现有JSON文件:
打开/content/data.json,确认文件内容是纯JSON(没有resp =前缀),且结构与原resp字典一致,特别是produto_servico_cadastro数组中的每个对象都包含componentes_kit字段。如果有错误,手动删除无效前缀或重新保存。验证读取后的数据结构:
在脚本2中添加调试代码,确认读取的数据是否正确:
f = open('/content/data.json') data = json.load(f) print(data['produto_servico_cadastro'][0].keys()) # 检查第一个元素是否包含componentes_kit
内容的提问来源于stack exchange,提问作者DTP - PEDRO
相关产品推荐
相关产品推荐

