You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何脚本内直接定义的列表可用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能正常运行,说明原内存数据是完整的,因此前者的概率更高。

解决方案

  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)
  1. 检查并修复现有JSON文件:
    打开/content/data.json,确认文件内容是纯JSON(没有resp = 前缀),且结构与原resp字典一致,特别是produto_servico_cadastro数组中的每个对象都包含componentes_kit字段。如果有错误,手动删除无效前缀或重新保存。

  2. 验证读取后的数据结构:
    在脚本2中添加调试代码,确认读取的数据是否正确:

f = open('/content/data.json')
data = json.load(f)
print(data['produto_servico_cadastro'][0].keys())  # 检查第一个元素是否包含componentes_kit

内容的提问来源于stack exchange,提问作者DTP - PEDRO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:00:17