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")
问题原因
- 文件读取错误:用户上传的是Excel文件,但代码使用
pd.read_csv读取,无法正确解析Excel格式,导致生成的DataFrame为空,后续导出的CSV自然也无内容。 - BytesIO指针位置问题:将字符串写入BytesIO后,文件指针停在末尾,
send_file读取时无法获取有效内容。
修正方案
- 替换文件读取方法为
pd.read_excel(需根据Excel版本安装对应依赖:xlsx格式用openpyxl,xls格式用xlrd)。 - 处理BytesIO时,写完内容后将指针移到起始位置(
seek(0))。 - 移除无用的全局变量
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
相关产品推荐
相关产品推荐

