Python提取API返回JSON指定字段生成目标CSV的代码问题求解
问题背景
通过API拉取JSON格式的用户数据,需要忽略无关字段,提取指定内容生成格式匹配的Output.csv文件,现有Python代码运行无法输出符合要求的文件。
原代码问题点
- 字段提取缺失:仅提取了
local嵌套节点下的内容,遗漏了results数组每个元素顶层必填的id、unid字段,和目标CSV列要求不匹配 - 语法调用错误:
item_list是字典组成的列表,item_list[0]为单个字典对象,不存在to_csv方法,运行时会直接抛出属性错误;且仅尝试导出第一条数据,无法得到全量结果 - 路径逻辑错误:写死导出文件名为
change.csv,没有使用传入的path_save参数指定保存位置 - 缺少容错逻辑:没有校验接口请求状态,请求失败时直接解析响应内容会触发异常
- 参考JSON示例存在语法瑕疵:
local节点闭合后未加逗号分隔后续字段,实际接口返回标准合法JSON即可正常解析
修正后代码
import requests from pathlib import Path import pandas as pd import time import argparse parser = argparse.ArgumentParser(description="Process API user data to CSV") parser.add_argument("-path_save", required=True, help="define where to save the output CSV file") parser.add_argument("--verbose", action='store_true', help="display processing information") def GetUsers(URL, path_save, verbose): # 发起接口请求 response = requests.get( URL, auth=('api@api.net', '1234'), headers={ 'Content-Type': 'application/json', 'key': 'Hb65OJBrrtV', } ) # 校验请求是否成功 response.raise_for_status() resp_data = response.json() result_list = [] # 遍历results节点提取需要的字段 for user_item in resp_data.get("results", []): local_info = user_item.get("local", {}) # 临时命名字段避免字典重复键覆盖值 row = { "top_id": user_item.get("id"), "unid": user_item.get("unid"), "local_id": local_info.get("id"), "dateFormat": local_info.get("dateFormat"), "languageTag": local_info.get("languageTag") } result_list.append(row) if verbose: print(f"Loaded record: {user_item.get('id')}") # 转成DataFrame,修改列名严格对齐示例格式(存在重名字段id) df = pd.DataFrame(result_list) df.columns = ["id", "unid", "id", "dateFormat", "languageTag"] output_path = Path(path_save) / "Output.csv" df.to_csv(output_path, index=False) print(f"File saved to: {output_path}") if __name__ == '__main__': start = time.time() args = parser.parse_args() path_save = Path(args.path_save) verbose = args.verbose endPoint = ['users'] for endPt in endPoint: URL = "https://api.com/v95/" + endPt GetUsers(URL, path_save, verbose) print(f"Processed time: {time.time() - start:.2f}s")
运行说明
- 运行脚本时传入
-path_save参数指定CSV保存的文件夹路径,添加--verbose参数可以打印单条记录的加载进度 - 导出的CSV列顺序、列名完全和提供的示例格式对齐
- 如果实际使用中需要区分两个重名的
id字段,可以自行修改导出时的列名(比如把第二个id改为local_id),避免后续处理CSV时出现字段冲突
内容的提问来源于stack exchange,提问作者ghj
相关产品推荐
相关产品推荐

