※本記事は、streamlit 1.53.0を前提に記載しています。
概要
Streamlitによるファイルアップロードはfile_uploader()を使って実装します。例えば以下のような形です。
import streamlit as st
uploaded = st.file_uploader( 'File Uploader',
type='csv',
accept_multiple_files=False,
max_upload_size=100,
label_visibility='collapsed'
)
上記を実行するとブラウザ表示は以下のようになります。
file_uploader()の返り値は、UploadedFile(※BytesIOのサブクラス)のインスタンス、あるいはそのリストになります。単一インスタンスになるかリストになるかは複数ファイルのアップロードを受け付けるかどうかで決まります。
主な引数
st.file_uploader()の引数としては以下のようなものがあります。(全てではないです。アプリ実装する上でよく使われそうなものを抜粋。)
| パラメータ名 | 説明 |
|---|---|
| type | アップロードを許容するファイルの拡張子。 None、文字列、文字列のリストを指定可能。 Noneを指定すると全てのファイルを許容する形となる。 |
| max_upload_size | アップロードを許容するファイルサイズの上限。単位はMB。 指定しない場合はconfig.toml内のserver.maxUploadSizeを適用。 |
| accept_multiple_files | True:複数ファイルを同時にアップロード可能。 False:複数ファイルの同時アップロード不可。 'directory':アップロード時の指定対象がディレクトリとなる。アップロードされるのは、指定したディレクトリ配下の全てのファイル。サブディレクトリが存在する場合は、サブディレクトリ内のファイルもアップロードされる。なお、typeが指定されている場合は、その指定内容に合致するファイルのみが対象となる。 |
| on_change | st.file_uploader()の値が変わったときに実行されるcallback関数。 |
| args | on_changeで指定したcallback関数に渡す引数。データ型としてはlistかtuple。 |
| kwargs | on_changeで指定したcallback関数に渡すキーワード引数。データ型としてはdict。 |
typeのデフォルト値はNoneですが、実際にアプリケーションを実装する際は何かしら設定し、許容するファイルのタイプ(拡張子)を必要最低限にするのが良いと思います。
on_changeで指定したcallback関数の実行タイミングは「値が変わったとき」のため、ファイルアップロードされた時だけでなく、GUI操作によりファイルが削除された時(図内の赤丸の「×」をクリックした時)にも実行されます。

accept_multiple_files=Falseで、既にファイルがアップロードされておりそのファイルを削除しないで新しいファイルをアップロードした場合、st.file_uploader()が返す値は最後にアップロードされたファイルの内容に更新されます(※accept_multiple_files=Trueの場合は、単にデータが追加されます)。また、Drag&Dropで無理やり複数ファイルをアップロードしようとした場合は、以下のようにエラーメッセージが表示されます。typeへの指定内容と合わないファイルをアップロードしようとした場合も同様の挙動となります。
アップロードデータの扱い方
前述の通り、file_uploader()の戻り値はUploadedFile(BytesIOのサブクラス)インスタンス(またはそのリスト)です。各インスタンスはfile-likeな扱いが可能です。例えば、以下のような形です。
import pandas as pd
import streamlit as st
uploaded = st.file_uploader( 'File Uploader',
type='csv',
accept_multiple_files=False,
max_upload_size=100,
label_visibility='collapsed'
)
if uploaded :
st.dataframe( pd.read_csv( uploaded, encoding='shift_jis' ) )
こんな形の利用も可能です。
import streamlit as st
uploaded = st.file_uploader( 'File Uploader',
type='csv',
accept_multiple_files=False,
max_upload_size=100,
label_visibility='collapsed'
)
if uploaded :
for l in uploaded.readlines() :
st.write( l.decode( 'shift_jis' ) )
参考情報
Streamlit公式ドキュメント
記事内で例で使用したデータ
以下のサイトから取得しています。
(具体的な方法は忘れてしまいました…。)



