【问题标题】:Flask send_file returns empty csv fileFlask send_file 返回空的 csv 文件
【发布时间】:2023-01-27 16:16:51
【问题描述】:

我正在创建简单的 flask 应用程序,用户在其中使用 /upload 函数在一个路径中输入 excel 文件并在同一路径上处理 pandas 操作,它必须将处理后的数据帧返回到 /download 路径中的 csv/excel。到目前为止,我使用了这段代码

@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")

上面的代码返回空的 data.csv 文件如何更正它

【问题讨论】:

    标签: python pandas flask


    【解决方案1】:

    您的代码的问题是您正在下载函数中创建一个新的文件对象并返回它,但文件的内容尚未写入其中。您不应创建新的文件对象,而应读取存储在会话变量“df”中的数据并将其写入要返回的文件对象。 这是一个示例,说明如何修改下载功能以实现此目的:

        @application.route("/download", methods=["POST"])
    def download():
        if "df" in session:
            csv = session["df"]
            buf = io.StringIO(csv)
            return send_file(buf,
                             mimetype="text/csv",
                             as_attachment=True,
                             attachment_filename="data.csv")
        else:
            return "No data found to download", 404
    

    您可以将 StringIO 替换为 BytesIO 并使用 buf.getvalue() 获取 csv 的字节值。 buf = io.BytesIO() buf.write(csv.encode('utf-8')) buf.seek(0)

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 1970-01-01
      • 2022-01-21
      • 2021-07-04
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多