Help us understand the problem. What is going on with this article?

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

More than 3 years have 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
miyahan
クラウド専業のMSPで運用の標準化や効率化(自動化)・監視システムの構築・運用をやっています
https://miyalog.hatenablog.jp/
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