LoginSignup
42

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-16

公式ドキュメント 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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
42