Streamlitでは、ボタンがクリックされるとページが再実行され、file_uploaderの状態がリセットされてしまうことがあります。
再実行時にも情報を保持する仕組みとして、session_stateが提供されています。
アップロードされたファイルをsession_stateに保存しておくことでリセットを回避できますが、file_uploaderから得られるファイルオブジェクトは、session_stateに保存することができません。エラーになってしまいます。
そのため、ファイルの内容を読み込み、session_stateに保存する方法を取る必要があります。以下にコード例を示します。
import streamlit as st
def save_uploaded_file(uploaded_file):
# ファイルの内容を読み取り、バイト列として保存
try:
bytes_data = uploaded_file.getvalue()
return bytes_data
except:
return None
# Session Stateの初期化
if 'uploaded_file' not in st.session_state:
st.session_state['uploaded_file'] = None
# File Uploaderの作成
uploaded_file = st.file_uploader("ファイルをアップロードしてください", type=['csv', 'xlsx'])
# アップロードされたファイルの保存
if uploaded_file is not None:
st.session_state['uploaded_file'] = save_uploaded_file(uploaded_file)
# 他のボタンの作成
if st.button('他の操作'):
st.write("他の操作がクリックされました")
# アップロードされたファイルの状態を表示(デバッグ用)
if st.session_state['uploaded_file'] is not None:
st.write("アップロードされたファイルが存在します")
テスト用の「他の操作」ボタンをクリックすると動作の確認ができます。