从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变成了列表,触发索引错误。
另外代码还有两个小问题:
requests.Get是错误写法,Python大小写敏感,应该是requests.get- 用
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
相关产品推荐
相关产品推荐

