Python
Flask

Flask にアップロードされたCSVファイルを保存せずに読み込む

More than 1 year has passed since last update.

公式ドキュメント Uploading Files — Flask Documentation などで save() メソッドでアップロードされたファイルをサーバー上に保存する手順は紹介されているものの、ファイルを保存せずそのまま読み込む方法がなかなか見当たらなかったため備忘録として残します。


その実体はバッファリングバイナリストリーム

Flask で request.files.get() (または request.files.getlist()[i]) を実行すると、Werkzeug の datastructures.FileStorage オブジェクトを得られます。このオブジェクトの stream こそがアップロードされたファイルのストリーム本体です。さらに FileStorage.streamio.BufferedIOBase を継承しているようなので、このストリームを煮るなり焼くなりすればよいみたいです。


アップロードされたCSVを読む

もしアップロードされたファイルをテキストとして読みたい場合、io.TextIOWrapper でテキストストリームにしてやると便利です。

クライアントからアップロードされたCSVをファイルを読み込むサンプルを示します。

import io

from flask import Flask, jsonify, request

@app.route('/upload/', methods=['POST'])
def csv_upload():
filebuf = request.files.get('csvfile')
if filebuf is None:
return jsonify(message='ファイルを指定してください'), 400
elif 'text/csv' != filebuf.mimetype:
return jsonify(message='CSVファイル以外は受け付けません'), 415

text_stream = io.TextIOWrapper(filebuf.stream, encoding='cp932')
for row in csv.reader(text_stream):
# do something

return jsonify(message=f'{filebuf.filename!r} を読み込みました'), 200