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

Windows Spyder运行正常的Python代码在CentOS7服务器执行报KeyError

问题产生原因
  • 接口返回字段不一致:服务器的网络环境、IP权限可能和本地Windows环境不同,导致接口返回的字段被裁剪,部分或全部嵌套字段(如contentModules等)没有返回,json_normalize执行后没有生成对应待删除的列。
  • pandas版本行为差异:CentOS7上Python3.6支持的最高pandas版本为1.1.5,远低于本地Python3.8对应的pandas版本,低版本pandas的drop()方法默认删除不存在的列时会直接抛出KeyError,不会自动跳过不存在的列。
  • 列数不足导致索引删除失败:你尝试按列索引删除时,dffinal的实际列数不足11列,不存在索引为5到10的列,因此也会抛出相同报错。
解决办法
  1. 安全删除列(最简便)
    给drop()方法添加errors='ignore'参数,该参数兼容pandas 0.16及以上版本,不存在的列会自动跳过,不会触发报错:
dffinal = dffinal.drop(
    ['contentModules','audience.customerSegmentInline.matching',
    'audience.customerSegmentInline.criteria', 'audience.lists',
    'audience.customerSegmentKind', 'audience.customerSegmentId'],
    axis=1,
    errors='ignore'
)

如果要按列索引删除,也添加相同参数即可:

dffinal = dffinal.drop([5,6,7,8,9,10], axis=1, errors='ignore')
  1. 统一环境依赖(避免其他版本问题)
    将本地的依赖版本同步到服务器,消除版本差异导致的行为不一致:
  • 本地Windows环境执行命令导出依赖:
    pip freeze > requirements.txt
  • 将生成的requirements.txt上传到服务器后执行:
    pip3 install -r requirements.txt
  1. 白名单模式保留列(更稳妥)
    如果明确最终需要保留的列,直接筛选保留目标列,避免删除逻辑的兼容性问题:
# 将下方列表替换为你实际需要保留的列名
keep_cols = ['id', 'title', 'create_time', 'xxx']
dffinal = dffinal.reindex(columns=keep_cols)
  1. 排查接口权限(可选)
    如果需要严格校验字段完整性,可在服务器端的json_normalize执行后打印返回的字段列表,确认接口返回是否完整:
print(a.columns.tolist()) # 打印单次请求的解析字段
print(dffinal.columns.tolist()) # 打印合并后的全量字段

内容的提问来源于stack exchange,提问作者Bushmaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:48:01