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

Flask send_file返回空CSV文件问题及代码修正求助

Flask上传Excel处理后返回空CSV的问题修正

问题描述

开发简易Flask应用,用户通过/chart1路由上传Excel文件,在该路由中执行Pandas数据处理,需在/download路由返回处理后的DataFrame为CSV文件,但目前返回的data.csv为空文件。

原代码:

@application.route('/chart1', methods=['GET', 'POST'])
def upload():
        if request.method == 'POST':
            global dfw
            df = pd.read_csv(request.files.get('file'), skiprows=13, sep=";", header=None)
            df.fillna(0, inplace=True)
            df.replace(['0x', ''], ['', ''], regex=True, inplace=True)
            df.columns = ["Time", "Type", "ID", "DL", "D0", "D1", "D2", "D3", "D4", "D5", "D6"]
            session["df"] = df.to_csv(index=False, header=True, sep=";")
            return render_template('upload.html')
@application.route("/download", methods=["POST"])
def download():
    csv = session["df"] if "df" in session else ""
    buf_str = io.StringIO(csv)
    buf_byt = io.BytesIO(buf_str.read().encode("utf-8"))
    return send_file(buf_byt,
                     mimetype="text/csv",
                     as_attachment=True,
                     download_name="data.csv")

问题原因

  1. 文件读取错误:用户上传的是Excel文件,但代码使用pd.read_csv读取,无法正确解析Excel格式,导致生成的DataFrame为空,后续导出的CSV自然也无内容。
  2. BytesIO指针位置问题:将字符串写入BytesIO后,文件指针停在末尾,send_file读取时无法获取有效内容。

修正方案

  1. 替换文件读取方法为pd.read_excel(需根据Excel版本安装对应依赖:xlsx格式用openpyxl,xls格式用xlrd)。
  2. 处理BytesIO时,写完内容后将指针移到起始位置(seek(0))。
  3. 移除无用的全局变量dfw,补充GET请求的返回逻辑。

修正后的代码:

import io
import pandas as pd
from flask import request, render_template, session, send_file

@application.route('/chart1', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        # 读取Excel文件,engine参数根据文件格式选择
        df = pd.read_excel(request.files.get('file'), skiprows=13, header=None, engine='openpyxl')
        df.fillna(0, inplace=True)
        df.replace(['0x', ''], ['', ''], regex=True, inplace=True)
        df.columns = ["Time", "Type", "ID", "DL", "D0", "D1", "D2", "D3", "D4", "D5", "D6"]
        # 将处理后的CSV字符串存入session
        session["df"] = df.to_csv(index=False, header=True, sep=";")
        return render_template('upload.html')
    # GET请求时返回上传页面
    return render_template('upload.html')

@application.route("/download", methods=["POST"])
def download():
    csv = session.get("df", "")
    if not csv:
        return "无可用的处理数据", 400
    
    # 直接将CSV字符串编码为BytesIO,并重置指针位置
    buf_byt = io.BytesIO(csv.encode("utf-8"))
    buf_byt.seek(0)
    
    return send_file(buf_byt,
                     mimetype="text/csv",
                     as_attachment=True,
                     download_name="data.csv")

额外注意事项

  • 安装依赖:执行pip install pandas openpyxl flask(xls文件需替换openpyxl为xlrd)。
  • 若处理后的数据量较大,session存储可能受限,建议改用服务器临时文件或数据库存储DataFrame,避免session溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:56:05