【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とかなり似ているのでとっつきやすかったです。というか多分これが標準的な形なんだろうな。