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

从API批量获取大量记录时Python代码抛出TypeError错误

解决调用API处理JSON数据时的TypeError问题

问题分析

你遇到的TypeError: list indices must be integers or slices, not str错误,根本原因是代码对API返回的JSON结构判断错误:

  • 你提供的接口返回示例是列表(数组),但代码中却尝试用data['data']去索引,而列表只能用整数/切片索引,不能用字符串。
  • 小数据量时无报错,大概率是因为此时API返回的是包含data键的字典结构(比如{"data": [...]}),而大数据量时API返回逻辑变化(比如直接返回列表、或部分请求失败返回错误格式),导致data变成了列表,触发索引错误。

另外代码还有两个小问题:

  1. requests.Get是错误写法,Python大小写敏感,应该是requests.get
  2. 用df.append拼接DataFrame已被pandas弃用,效率极低,推荐用pd.concat

修正后的代码

import requests
import pandas as pd

evaluations_array = df_evaluations_results.evaluationId.unique()
df_itens = pd.DataFrame()

for eval_id in evaluations_array:
    # 修正requests方法的大小写,发起请求
    response = requests.get(f'https://.../{eval_id}/results', headers=headers)
    
    # 先检查请求是否成功,跳过错误响应
    if response.status_code != 200:
        print(f"评估ID {eval_id} 请求失败,状态码:{response.status_code}")
        continue
    
    try:
        # 直接用response.json()解析,比手动json.loads更可靠
        data = response.json()
    except ValueError:
        print(f"评估ID {eval_id} 返回无效JSON,跳过")
        continue
    
    # 兼容两种返回结构:直接返回列表,或返回带data键的字典
    if isinstance(data, list):
        df = pd.json_normalize(data)
    elif isinstance(data, dict) and 'data' in data:
        df = pd.json_normalize(data['data'])
    else:
        print(f"评估ID {eval_id} 返回结构不符合预期,跳过")
        continue
    
    # 用pd.concat高效拼接DataFrame
    df_itens = pd.concat([df_itens, df], ignore_index=True)

print(df_itens)

关键优化点

  • 请求合法性检查:增加状态码判断,避免处理错误响应(比如500、404)导致的异常
  • JSON解析容错:捕获解析错误,防止单个无效响应中断整个循环
  • 结构兼容处理:同时支持列表和带data键的字典两种返回格式,解决小/大数据量返回结构不一致的问题
  • 性能优化:用pd.concat替代append,大幅提升大数据量下的拼接效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11