Python Flask发送_文件StringIO空白文件

Python Flask发送_文件StringIO空白文件,python,flask,stringio,Python,Flask,Stringio,我使用的是python 3.5和flask 0.10.1,我很喜欢,但是在发送文件时遇到了一些问题。我最终想要处理一个pandas数据帧(来自表单数据,在本例中未使用,但在将来是必需的),并将其作为csv(没有临时文件)发送下载。我所见过的实现这一点的最好方法是与我们合作 以下是我尝试使用的代码: @app.route('/test_download', methods = ['POST']) def test_download(): buffer = StringIO() bu

我使用的是python 3.5和flask 0.10.1,我很喜欢,但是在发送文件时遇到了一些问题。我最终想要处理一个pandas数据帧(来自表单数据,在本例中未使用,但在将来是必需的),并将其作为csv(没有临时文件)发送下载。我所见过的实现这一点的最好方法是与我们合作

以下是我尝试使用的代码:

@app.route('/test_download', methods = ['POST'])
def test_download():
    buffer = StringIO()
    buffer.write('Just some letters.')
    buffer.seek(0)
    return send_file(buffer, as_attachment = True,\
    attachment_filename = 'a_file.txt', mimetype = 'text/csv')
文件以正确的名称下载,但该文件完全为空

有什么想法吗?编码问题?其他地方有没有回答这个问题?
谢谢

我想你应该写字节

from io import BytesIO    

from flask import Flask, send_file


app = Flask(__name__)


@app.route('/test_download', methods=['POST'])
def test_download():
    # Use BytesIO instead of StringIO here.
    buffer = BytesIO()
    buffer.write(b'jJust some letters.')
    # Or you can encode it to bytes.
    # buffer.write('Just some letters.'.encode('utf-8'))
    buffer.seek(0)
    return send_file(buffer, as_attachment=True,
                     attachment_filename='a_file.txt',
                     mimetype='text/csv')


if __name__ == '__main__':
    app.run(debug=True)

如果有人将Python2.7与Flask一起使用,并通过导入模块StringIO而获得了错误。这篇文章可以帮助你解决你的问题

如果要导入字符串IO模块,只需使用以下命令更改导入语法:来自IO导入StringIO而不是来自StringIO导入StringIO

如果您使用的是image或其他ressource,也可以使用来自io导入字节io的


谢谢

这里的问题是,在Python 3中,您需要将
StringIO
csv一起使用。write
send_file
需要
BytesIO
,因此您必须同时执行这两项操作

@app.route('/test_download')
def test_download():
    row = ['hello', 'world']
    proxy = io.StringIO()
    
    writer = csv.writer(proxy)
    writer.writerow(row)
    
    # Creating the byteIO object from the StringIO Object
    mem = io.BytesIO()
    mem.write(proxy.getvalue().encode())
    # seeking was necessary. Python 3.5.2, Flask 0.12.2
    mem.seek(0)
    proxy.close()

    return send_file(
        mem,
        as_attachment=True,
        attachment_filename='test.csv',
        mimetype='text/csv'
    )

@但是你不能对一个封闭的文件进行操作。是的,这是有效的——我刚刚知道python 3上的flask不能与StringIO一起工作。后续问题——您知道如何将熊猫数据帧转换为字节csv以供下载吗?@DanielHitchcock Hi,您应该提供一个最小的、完整的、可验证的示例,这样我就可以重现这个问题(类似于这个问题,但使用熊猫数据帧示例),我不太熟悉熊猫,所以我目前的答案是否定的。如果有必要,你可以问另一个问题。这应该是可以接受的答案,因为它在使用send_file()方法导出/下载CSV文件方面更为通用。在编码中,我添加了
“utf-8-sig”
,或者你可能想要
“utf-8”
。也看到