API获取JSON数据并存储为DataFrame时append方法失效导致结果为空的问题求助
循环分页获取API数据时DataFrame.append()不生效导致结果为空的问题
你碰到的这个问题我之前也踩过坑!核心原因是Pandas的append()方法不会原地修改原DataFrame——它每次都会返回一个包含合并结果的新对象,你之前只调用了all_items.append(df)但没把返回值重新赋值给all_items,所以最初的空DataFrame根本没被更新,最后导出自然是空的。
快速修复现有代码
只需要修改循环里的append操作,把返回值重新赋值回去就行:
def get(): # 获取总记录数(这里其实可以优化,不用单独请求limit=1,后续第一次请求也能拿到total_count) r = requests.request("GET",'https://xx.com/projects.json?limit=1',verify=False, auth=('xy','xy')).json() total_record=r['total_count'] print("Total record: "+str(total_record)) all_items = pd.DataFrame() for offset in range(0, total_record,100): url = f"https://xx.com/projects.json?limit=100&offset={offset}" response = requests.get(url=url,verify=False, auth=('xy','xy')) data=response.json() df = pd.DataFrame(data['projects']) # 关键:将append的结果重新赋值给all_items,同时重置索引避免重复 all_items = all_items.append(df, ignore_index=True) all_items.to_csv("text.csv", encoding='utf-8', index=False) # 直接调用函数就行,不用print(get()),因为函数没有返回值 get()
另外注意去掉最后的print(get()),因为你的函数没有返回值,只会打印None,完全没必要。
更高效的实现方式(强烈推荐)
虽然上面的修复能解决问题,但多次调用append()会频繁创建新的DataFrame,数据量大的时候效率很低。更优的做法是先把所有项目数据收集到一个列表里,最后一次性转换成DataFrame:
import requests import pandas as pd def get_projects(): auth_credentials = ('xy', 'xy') # 获取总记录数 init_response = requests.get( 'https://xx.com/projects.json?limit=1', verify=False, auth=auth_credentials ).json() total_record = init_response['total_count'] print(f"Total record: {total_record}") all_projects_data = [] for offset in range(0, total_record, 100): url = f"https://xx.com/projects.json?limit=100&offset={offset}" response = requests.get( url, verify=False, auth=auth_credentials, timeout=10 # 增加超时设置,防止请求卡住 ) # 增加请求状态检查,避免失败时崩溃 if response.status_code == 200: data = response.json() all_projects_data.extend(data['projects']) else: print(f"Warning: Request failed at offset {offset}, status code: {response.status_code}") # 一次性转换为DataFrame,效率更高 projects_df = pd.DataFrame(all_projects_data) projects_df.to_csv("text.csv", encoding='utf-8', index=False) return projects_df # 调用函数 get_projects()
这个方案的优势:
- 避免了多次DataFrame合并的性能损耗
- 增加了超时和状态码检查,鲁棒性更强
- 用f-string拼接URL更简洁,把认证信息抽出来避免重复代码
内容的提问来源于stack exchange,提问作者Cesc
相关产品推荐
相关产品推荐

