- streamlit file_uploaderとは?結論:Pythonだけでブラウザからファイルを受け取れるウィジェット
- streamlit file_uploaderの基本パラメータ一覧
- streamlit file_uploaderの使い方:単一ファイルと複数ファイル
- streamlit file_uploaderのメリットとデメリット
- streamlit file_uploaderの容量制限と変更方法
- streamlit file_uploaderの注意点:セキュリティと型の扱い
- streamlit file_uploaderと他の選択肢の比較
- streamlit file_uploaderでよくあるつまずきと対処
- まとめ:streamlit file_uploaderは手軽さと設計力のバランスで選ぶ
streamlit file_uploaderとは?結論:Pythonだけでブラウザからファイルを受け取れるウィジェット
streamlit file_uploaderは、Streamlitアプリにファイルアップロード機能を追加するための標準ウィジェットです。結論から言うと、数行のPythonコードを書くだけで、ブラウザ経由でCSVやExcel、画像、PDFなどを受け取り、そのままpandasで読み込めるのが最大の特徴です。HTMLやJavaScript、サーバー側の受け口を自分で書く必要はありません。
たとえば次のように書くだけでアップロードUIが表示されます。
import streamlit as st
uploaded_file = st.file_uploader("CSVをアップロード", type="csv")
if uploaded_file is not None:
st.write(uploaded_file.name)
このように、streamlit file_uploaderは「ファイルを選ぶ→Python側で中身を読む」という流れを最小限の記述で実現します。データ分析のデモや社内ツールの試作と相性がよく、DjangoやFlaskで画面から作る場合と比べて圧倒的に短いコードで済みます。
streamlit file_uploaderの基本パラメータ一覧
まずは押さえておきたい引数を整理します。よく使うのは次のとおりです。
- label:ウィジェット上に表示する説明文。必須です。
- type:許可する拡張子。”csv” や [“png”, “jpg”] のように指定します。
- accept_multiple_files:Trueにすると複数ファイルを同時に受け取れます。
- key:ウィジェットを一意に識別するキー。同じ画面に複数置くときに使います。
- help:マウスオーバーで表示される補足説明。
- on_change:値が変わったときに呼ぶコールバック。
- disabled:Trueで操作を無効化。
- label_visibility:ラベルの表示・非表示を制御。
戻り値は、単一ファイルならUploadedFileオブジェクト、複数ファイルならそのリストになります。UploadedFileはファイルライクなオブジェクトなので、pandas.read_csvにそのまま渡せます。
streamlit file_uploaderの使い方:単一ファイルと複数ファイル
単一ファイルを受け取る基本形
もっともよく使う形です。typeで拡張子を絞ると、ユーザーが意図しないファイルを選ぶのを防げます。
import streamlit as st
import pandas as pd
f = st.file_uploader("CSVファイル", type="csv")
if f is not None:
df = pd.read_csv(f)
st.dataframe(df)
Excelを扱いたい場合は type=”xlsx” とし、pandas.read_excelに渡します。画像であればPillowのImage.openに渡すのが定番です。
複数ファイルをまとめて受け取る
accept_multiple_files=True にすると、戻り値がリストになります。複数のCSVを縦に結合する、といった処理が簡単に書けます。
files = st.file_uploader("複数CSV", type="csv", accept_multiple_files=True)
for f in files:
st.write(f.name)
注意点として、accept_multiple_filesをTrueにした場合、ファイルが0件のときは空リストが返ります。Noneチェックではなくlen()での判定に切り替えましょう。
streamlit file_uploaderのメリットとデメリット
メリット
- 追加のフロントエンド実装が不要で、Pythonだけで完結する。
- pandasやPillowなど既存ライブラリとそのままつながる。
- type指定により、受け取る拡張子をある程度制限できる。
- プロトタイプから本番の社内ツールまで同じ書き方で流用しやすい。
デメリット
- デフォルトのアップロード容量には上限があり、大きなファイルは弾かれる。
- 拡張子による制限はできるが、ファイル内容の安全性を保証するものではない。
- アップロードされたファイルはサーバー側のメモリに載るため、巨大ファイルや同時接続で負荷が高まる。
- 細かいUIカスタマイズや独自バリデーションは、自分で追加実装が必要。
つまり、手軽さと引き換えに、容量・セキュリティ・リソース管理は利用者側の設計に委ねられる部分が大きいと言えます。
streamlit file_uploaderの容量制限と変更方法
デフォルトではアップロードできるファイルサイズに上限があり、それを超えるとエラーになります。上限を変えたい場合は、プロジェクト直下の .streamlit/config.toml に次のように書きます。
[server]
maxUploadSize = 200
この値はMB単位です。ただし、上限を大きくするほどサーバーのメモリを消費します。クラウド上で動かしている場合は、インスタンスのメモリや同時利用人数もあわせて確認してください。容量を上げれば解決、と単純に考えないほうが安全です。
streamlit file_uploaderの注意点:セキュリティと型の扱い
実運用で気をつけたいポイントを整理します。
- 拡張子だけで信用しない:type指定はあくまでUI上のフィルタです。内容の検証は別途行いましょう。
- ファイル名をそのまま使わない:パス操作に使うと意図しない挙動につながるため、必要ならサニタイズします。
- 大きなファイルは分割や圧縮を検討:読み込み前にサイズを確認する処理を入れると安心です。
- 個人情報や機密情報の取り扱い:アップロード先の保存場所と保持期間を決めておきましょう。
- 型の変換:CSVの文字コードや日付列は、読み込み時に明示的に指定するとトラブルが減ります。
とくに、アップロードされたデータをそのまま公開URLで配信するような設計は避け、必要最小限の範囲で扱うのが基本です。
streamlit file_uploaderと他の選択肢の比較
ファイル受け取りの手段はほかにもあります。代表的なものと比べてみましょう。
- Django/Flaskでフォームを作る:自由度は高いが、画面とサーバー処理を自分で書く必要があり、工数が大きい。
- Jupyter上でアップロードする:分析には便利だが、不特定多数に使ってもらうツールには向かない。
- streamlit file_uploader:数行で完結し、そのままデータ処理につなげられる。一方で容量やUIの自由度には制約がある。
「まず動くものを見せたい」「社内の限られたメンバーが使う」という場面では、streamlit file_uploaderがもっとも現実的な選択になりやすいです。逆に、厳密な権限管理や大容量ファイルの安定処理が必須なら、専用の仕組みを検討したほうがよいでしょう。
streamlit file_uploaderでよくあるつまずきと対処
- ファイルがNoneのまま:アップロード前はNoneです。if文で必ずガードしましょう。
- 文字化けする:read_csvのencodingを明示すると改善することがあります。
- 複数ファイルでエラー:accept_multiple_filesの有無で戻り値の型が変わる点を確認してください。
- 再実行で状態が消える:Streamlitは操作のたびにスクリプトが再実行されます。必要ならsession_stateで保持します。
- 容量オーバーで弾かれる:config.tomlのmaxUploadSizeを見直します。
これらはどれも、公式ドキュメントの範囲で対処できる基本的なものです。困ったときは引数の意味に立ち返ると解決が早くなります。
まとめ:streamlit file_uploaderは手軽さと設計力のバランスで選ぶ
streamlit file_uploaderは、Pythonだけでファイルアップロードを実現できる非常に便利なウィジェットです。単一・複数ファイルの受け取り、typeによる拡張子の絞り込み、pandasとの連携まで、少ない記述でカバーできます。
一方で、容量制限、セキュリティ、メモリ消費といった点は利用者側の設計に委ねられます。手軽さに頼りきらず、maxUploadSizeの調整や入力検証をあわせて行うことが、長く使えるアプリへの近道です。まずは小さなCSVで動作を確認し、そこから複数ファイルや大容量の扱いへと段階的に広げていくとよいでしょう。

コメント