You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

代码关键说明

  1. 状态持久化:用st.session_state.file_list保存文件名列表,确保页面重运行时数据不丢失。
  2. 上传文件处理:每次上传时提取所有选中文件的文件名,仅添加列表中不存在的新文件名,避免重复。
  3. 删除操作:为每个列表项绑定独立的删除按钮(通过key=f"delete_{idx}"区分),删除后调用st.rerun()刷新页面更新列表。
  4. 保存与加载:
    • 保存:将列表转为JSON字符串,通过st.download_button让用户下载保存。
    • 加载:通过文件上传器读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:22:55