如何用Streamlit维护用户上传文件列表并支持增删与存读?
Streamlit实现本地文件名列表的增删与保存加载功能
核心思路
Streamlit的file_uploader在多文件模式下,每次用户调整选中文件(添加或移除)时,都会返回当前所有选中文件的完整列表。要维护独立的文件名列表并支持增删,必须用st.session_state来持久化数据,避免每次页面重运行时丢失状态。
完整实现代码
import streamlit as st import json # 初始化session_state中的文件名列表 if 'file_list' not in st.session_state: st.session_state.file_list = [] # 1. 文件上传模块 uploaded_files = st.file_uploader("上传inp文件", type='inp', accept_multiple_files=True) if uploaded_files: # 提取当前上传的所有文件名,去重后更新到列表 current_uploaded_names = [file.name for file in uploaded_files] # 只添加列表中没有的新文件名 for name in current_uploaded_names: if name not in st.session_state.file_list: st.session_state.file_list.append(name) # 2. 文件名列表展示与删除操作 st.subheader("当前文件名列表") if st.session_state.file_list: # 遍历列表,为每个条目添加删除按钮 for idx, filename in enumerate(st.session_state.file_list): col1, col2 = st.columns([0.8, 0.2]) with col1: st.write(filename) with col2: if st.button(f"删除", key=f"delete_{idx}"): del st.session_state.file_list[idx] st.rerun() # 删除后刷新页面 else: st.write("列表为空,请上传文件") # 3. 保存列表功能 if st.session_state.file_list: # 将列表转为JSON格式字符串 list_json = json.dumps(st.session_state.file_list) st.download_button( label="保存文件名列表", data=list_json, file_name="file_list.json", mime="application/json" ) # 4. 加载列表功能 st.subheader("加载已保存的列表") loaded_file = st.file_uploader("选择保存的列表文件", type='json', accept_multiple_files=False) if loaded_file: # 读取并解析JSON文件 loaded_list = json.load(loaded_file) if isinstance(loaded_list, list): st.session_state.file_list = loaded_list st.success("列表加载成功!") st.rerun()
代码关键说明
- 状态持久化:用
st.session_state.file_list保存文件名列表,确保页面重运行时数据不丢失。 - 上传文件处理:每次上传时提取所有选中文件的文件名,仅添加列表中不存在的新文件名,避免重复。
- 删除操作:为每个列表项绑定独立的删除按钮(通过
key=f"delete_{idx}"区分),删除后调用st.rerun()刷新页面更新列表。 - 保存与加载:
- 保存:将列表转为JSON字符串,通过
st.download_button让用户下载保存。 - 加载:通过文件上传器读取JSON文件,解析后替换当前列表。
- 保存:将列表转为JSON字符串,通过
你提供的代码示例问题说明
原代码片段(已翻译):
chosen_file = st.file_uploader("上传inp文件:", type='inp', accept_multiple_files=True) for inp in chosen_inp_files: if inp is not None: inp_list.append(inp.name)
这段代码的问题在于:
- 没有使用
st.session_state持久化inp_list,每次页面重运行时列表会重置。 - 无法处理用户移除上传文件的操作:当用户从上传器中移除某个文件时,
file_uploader返回的列表会排除该文件,但原代码只会追加新文件,不会同步移除已删除的条目。
内容的提问来源于stack exchange,提问作者evening
相关产品推荐
相关产品推荐

