使用Flask下载多个CSV?

ora*_*ge1 4 python flask

我有一个应用程序,它接收一些信息,使用pandas执行一些计算,并将最终的pandas数据框转换为CSV,然后使用Flask应用程序下载.如何在一个视图中下载多个CSV?似乎我一次只能返回一个响应.

一个示例代码段:

def serve_csv(dataframe,filename):
    buffer = StringIO.StringIO()
    dataframe.to_csv(buffer, encoding='utf-8', index=False)
    buffer.seek(0)
    return send_file(buffer,
             attachment_filename=filename,
             mimetype='text/csv')

def make_calculation(arg1, arg2):
   '''Does some calculations.
   input: arg1 - string, arg2- string
   returns: a pandas data frame'''

@app.route('test_app', methods=['GET', 'POST']
def test_app():
    form = Form1()
    if form.validate_on_submit():
    calculated_dataframe = make_calculation(str(form.input_1.data), str(form.input_2.data))
        return serve_csv(calculated_dataframe, 'Your_final_output.csv')
    return render_template('test_app.html', form=form)
Run Code Online (Sandbox Code Playgroud)

所以我们在上面的例子中说make_calculation返回了两个pandas数据帧.如何将它们打印到CSV?

kem*_*mis 10

这是您使用的所有代码Zip files.它将返回包含所有文件的zip文件.

在我的程序中,我想要压缩的所有东西都在一个output文件夹中,所以我只是使用os.walk并将其放在zip文件中write.在返回之前,file您需要关闭它,如果您不关闭它将返回一个空文件.

import zipfile
import os
from flask import send_file

@app.route('/download_all')
def download_all():
    zipf = zipfile.ZipFile('Name.zip','w', zipfile.ZIP_DEFLATED)
    for root,dirs, files in os.walk('output/'):
        for file in files:
            zipf.write('output/'+file)
    zipf.close()
    return send_file('Name.zip',
            mimetype = 'zip',
            attachment_filename= 'Name.zip',
            as_attachment = True)
Run Code Online (Sandbox Code Playgroud)

html我简单地称之为路线:

<a href="{{url_for( 'download_all')}}"> DOWNLOAD ALL </a>
Run Code Online (Sandbox Code Playgroud)

我希望这有助于某人.:)

  • 我宁愿使用上下文管理器,以避免关闭的事情:`with Zipfile(...) as zf: zf.write(...)`。如果出现意外异常,它会更干净、更安全。另外,您可以使用 os.listdir() 代替 os.walk() 。 (3认同)

des*_*ido 6

您可以返回一个MIME Multipart响应,一个zip文件或一个TAR球(请注意,链接的RFC有点过时了,但是因为它是HTML格式,所以更容易快速上手;官方的在这里)。

如果选择执行MIME多部分响应,那么一个不错的起点可能是查看MultipartEncoderand MultipartDecoderin request工具带;您可能可以直接使用它们,或者至少使用它们的子类/组成来获得所需的行为。可以使用标准库模块来实现Zip文件TAR球

一种替代方法是设计您的API,以便您返回JSON,使用标头(或XML元素或JSON字段)表示可以通过其他请求或类似请求获得其他CSV。