0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Streamlitによるファイルアップロード実装

0
Posted at

※本記事は、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'
)

上記を実行するとブラウザ表示は以下のようになります。

20260128_3.png

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操作によりファイルが削除された時(図内の赤丸の「×」をクリックした時)にも実行されます。
20260128_1.png

accept_multiple_files=Falseで、既にファイルがアップロードされておりそのファイルを削除しないで新しいファイルをアップロードした場合、st.file_uploader()が返す値は最後にアップロードされたファイルの内容に更新されます(※accept_multiple_files=Trueの場合は、単にデータが追加されます)。また、Drag&Dropで無理やり複数ファイルをアップロードしようとした場合は、以下のようにエラーメッセージが表示されます。typeへの指定内容と合わないファイルをアップロードしようとした場合も同様の挙動となります。

20260128_2.png

アップロードデータの扱い方

前述の通り、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' ) )

20260128_4.png

こんな形の利用も可能です。

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' ) )

20260128_5.png

参考情報

Streamlit公式ドキュメント

記事内で例で使用したデータ

以下のサイトから取得しています。
(具体的な方法は忘れてしまいました…。)

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?