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

如何在FastAPI中流式传输DataFrame而无需保存为CSV文件?

在FastAPI中流式传输Pandas DataFrame(无需本地文件)

问题分析

你的/option7尝试直接返回DataFrame的迭代器,但DataFrame本身并不是适合流式输出的字节或文本流,必须先将其转换为可逐段生成的格式,同时避免写入本地CSV文件。

解决方案1:流式输出CSV格式

利用Pandas的to_csv方法,通过设置chunksize分块生成CSV内容,配合生成器函数逐块返回:

from fastapi import FastAPI, StreamingResponse
import pandas as pd
import io

app = FastAPI()

# 预先加载DataFrame(动态生成的DataFrame也可在接口内处理)
df = pd.read_csv("data.csv")

@app.get("/stream-csv")
def stream_dataframe_csv():
    def generate_csv():
        # 先输出CSV表头
        yield df.columns.to_csv(sep=",", index=False, line_terminator="\n")
        # 分块迭代DataFrame,逐块输出CSV内容
        for chunk in df.to_csv(sep=",", index=False, header=False, chunksize=1000):
            yield chunk

    return StreamingResponse(
        generate_csv(),
        media_type="text/csv",
        headers={"Content-Disposition": "attachment; filename=data.csv"}
    )

解决方案2:流式输出JSON Lines格式(逐行JSON对象)

如果需要返回JSON格式,推荐使用JSON Lines(每行一个JSON对象),既适合流式传输,也方便客户端解析:

@app.get("/stream-json-lines")
def stream_dataframe_json():
    def generate_json():
        # 逐行将DataFrame的行转换为JSON字符串
        for _, row in df.iterrows():
            yield row.to_json() + "\n"

    return StreamingResponse(
        generate_json(),
        media_type="application/jsonlines",
        headers={"Content-Disposition": "attachment; filename=data.jsonl"}
    )

关键说明

  • 避免将整个DataFrame转换为完整的CSV/JSON字符串后再返回,减少内存占用,提升响应速度
  • 分块大小chunksize可根据DataFrame规模调整,平衡内存使用和传输效率
  • 流式传输对大体积DataFrame尤其友好,不会因一次性加载全部数据导致内存溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:01:11