2016-02-29 96 views
3

我使用Python 3.5和燒瓶0.10.1並喜歡它,但與send_file有點麻煩。我最終想要處理一個熊貓數據框(來自表單數據,在此示例中未使用,但將來必要時),並將其作爲csv(無臨時文件)下載。達到這個目標的最好方法就是給我們StringIO。Python燒瓶send_file 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') 

的文件下載適當的名稱,但該文件是完全空白。

任何想法?編碼問題?這在其他地方有答案嗎? 謝謝!

+0

@bernie但是你不能在一個封閉的文件上操作。 –

回答

7

我想你應該寫字節。

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) 
+0

是的,它的工作原理 - 我剛剛瞭解到python 3上的燒瓶不適用於StringIO。後續問題 - 你知道一種將熊貓數據框轉換爲字節CSV文件進行下載的方法嗎? –

+1

@DanielHitchcock嗨,你應該提供一個最小化,完整和可驗證的例子,這樣我可以重現這個問題(就像這個問題,但與熊貓數據框的例子),我不安靜熟悉熊貓,所以我目前的答案是否定的。如有必要,你可以提出另一個問題。 –

1

如果有人在Flask中使用python 2.7,並通過導入模塊獲得有關模塊StringIO的錯誤。這篇文章可以幫助你解決你的問題。

如果要導入字符串IO模塊,你可以使用這個更改導入語法:從IO導入StringIO的代替從StringIO的進口StringIO的

如果您使用的是圖像或其他資源,您也可以使用io import BytesIO中的

謝謝

2

這裏的問題是,在Python 3,您需要使用StringIOcsv.writesend_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(0) 

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