Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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


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


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


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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
Help us understand the problem. What are the problem?