【Python】FlaskでCSVを受け取ってDataFrameにする

【Python】FlaskでCSVを受け取ってDataFrameにする


# flask # python

環境

Python==3.8.1

Flask==1.1.1

Werkzeug==1.0.0

目的

機械学習系のWebアプリを作る場合は、CSVを受け取って処理をすることが多いと思います。 (今はディープラーニングだから画像メインだろとかは知りません←)

Flaskでのサンプルはかなり出回っていますが、自分の整理のために。

実際のコード

import pandas as pd
from flask import Flask, request
from werkzeug.datastructures import FileStorage

app = Flask(__name__)


@app.route('/')
def awesome_route_with_csv():
    csv_data = request.files['data']
    # csvファイルのみ受け付ける
    if isinstance(csv_data, FileStorage) and csv_data.content_type == 'text/csv':
        df = pd.read_csv(csv_data)
    else:
        raise ValueError('data is not csv')

    return list(df.columns)

if __name__ == '__main__':
    app.debug = True
    app.run()

Flaskでは、form-dataでfileが送信されると、request.filesでその中身を取得できます。

request.filesはディクショナリを継承した型が使われており、通常の辞書型と同じようにデータにアクセスすることが出来ます。 アクセスする際のキーは、form-dataを送信する際のキーと同じものなので直感的でした。

データの中身はFlaskの内部で動いているwerkzeugのFileStorage型となっていますが、そのままpd.read_csvでDataFrameとすることが出来ます。 (read_csvはパスからの読み込みだけでなく、bufferからの読み込みにも対応しています。便利。)

なお、file以外のフィールドについてはrequest.jsonにデータが格納されるようになっています。

 

Djangoとかなり似ているのでとっつきやすかったです。というか多分これが標準的な形なんだろうな。