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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:39:19