web-dev-qa-db-ja.com

Python Flask send_file StringIO空のファイル

python 3.5とflask 0.10.1を使用して気に入っていますが、send_fileに少し問題があります。 pandasデータフレーム(この例では未使用ですが、将来必要になるフォームデータから)を最終的に処理し、csv(一時ファイルなし)としてダウンロードして送信します。これを実現するための最良の方法は、StringIOを使用することです。

これが私が使用しようとしているコードです:

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

ファイルは適切な名前でダウンロードされますが、ファイルは完全に空白です。

何か案は?エンコーディングの問題?これは他の場所で回答されていますか?ありがとう!

21

ここでの問題は、Python 3ではStringIOcsv.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('utf-8'))
    # 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'
    )
33
Radu

バイトを書くべきだと思います。

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)
14
lord63. j

誰かがpython 2.7 with Flaskを使用し、それをインポートしてStringIOモジュールに関するエラーを受け取った場合。この投稿は問題解決に役立ちます。

String IO moduleをインポートしている場合は、これを使用してインポート構文を変更できます:from io import StringIO代わりにfrom StringIO import StringIO =。

画像または他のリソースを使用している場合は、from io import BytesIOを使用することもできます。

ありがとうございました

0
Lamine BA