调用curl获取JSON结果转换为pandas DataFrame时报错如何解决
问题核心原因
你的代码存在3处明确疏漏,最终传给pandas的根本不是接口返回的JSON结构数据,才会触发两类报错:
subprocess.run()默认不会捕获命令行的输出内容,你赋值给swaps的是Python的CompletedProcess运行实例对象,既不是JSON字符串,也不是解析后的字典/列表结构。- curl命令里的表单参数用了
"这一HTML转义字符,实际传给接口的参数会带多余转义符,会导致接口返回异常内容。 - 即便拿到了curl返回的文本内容,你也没有做JSON格式解析,直接把原始字符串传给pandas构造方法也无法识别。
你遇到的两个报错本质都是传参类型不匹配:json_normalize抛出NotImplementedError是因为输入不是它支持的字典/列表类型,from_dict抛出构造错误同理,接收到的根本不是字典结构。
修正代码
from subprocess import run import pandas as pd import json # 调用curl时增加输出捕获配置 resp = run( 'curl --location --request POST https://www.rmb.co.za/rates-service/rates/historical \ --form productType="Swaps" \ --form top="13"', shell=True, capture_output=True, text=True ) # 先校验curl执行状态 if resp.returncode != 0: raise RuntimeError(f"接口请求失败,错误信息:{resp.stderr}") # 解析JSON结构 parsed_data = json.loads(resp.stdout) # 根据接口返回的实际结构取目标数据,存在嵌套结构时可替换为pd.json_normalize(parsed_data['对应字段名']) swaps_df = pd.DataFrame(parsed_data['data'])
优化建议
- 生产场景下不推荐用subprocess调curl发请求,直接用
requests库实现POST请求更稳定,不需要处理命令行转义、shell执行风险、输出流捕获的额外逻辑,代码可维护性更高。 - 拿到接口返回内容后先打印解析后的结构,确认数据层级后再调用pandas的构造方法,避免因为字段层级不对触发解析错误。
内容的提问来源于stack exchange,提问作者blue_viper
相关产品推荐
相关产品推荐

