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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:44:05