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的列,因此也会抛出相同报错。
解决办法
- 安全删除列(最简便)
给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')
- 统一环境依赖(避免其他版本问题)
将本地的依赖版本同步到服务器,消除版本差异导致的行为不一致:
- 本地Windows环境执行命令导出依赖:
pip freeze > requirements.txt - 将生成的
requirements.txt上传到服务器后执行:pip3 install -r requirements.txt
- 白名单模式保留列(更稳妥)
如果明确最终需要保留的列,直接筛选保留目标列,避免删除逻辑的兼容性问题:
# 将下方列表替换为你实际需要保留的列名 keep_cols = ['id', 'title', 'create_time', 'xxx'] dffinal = dffinal.reindex(columns=keep_cols)
- 排查接口权限(可选)
如果需要严格校验字段完整性,可在服务器端的json_normalize执行后打印返回的字段列表,确认接口返回是否完整:
print(a.columns.tolist()) # 打印单次请求的解析字段 print(dffinal.columns.tolist()) # 打印合并后的全量字段
内容的提问来源于stack exchange,提问作者Bushmaster
相关产品推荐
相关产品推荐

