如何在Streamlit中仅清理特定st.cache函数的缓存
如何在Streamlit中仅清理指定
st.cache函数的缓存 要实现只清除特定@st.cache装饰函数的缓存而不影响其他函数,其实非常简单——每个被@st.cache装饰的函数都会自动获得一个clear()方法,调用这个方法就能精准清除该函数的所有缓存条目。
具体实现步骤
- 精准调用清理方法:针对你要清理的
get_data_from_csv函数,只需执行get_data_from_csv.clear()即可清除它的所有缓存,完全不会触动other_st_cache_function的缓存。 - 添加交互触发入口:你可以在UI中添加一个按钮,让用户在底层数据更新后手动触发缓存清理,重新加载最新数据。
修改后的完整代码示例
import os import pandas as pd import streamlit as st @st.cache def get_data_from_csv(folder_name, csv_name): # 修正原代码中的路径与筛选逻辑错误 folder_path = folder_name name_list = os.listdir(folder_path) # 筛选名称包含csv_name的目标文件 target_files = [f for f in name_list if csv_name in f] res = pd.DataFrame() for f in target_files: temp_df = pd.read_csv(os.path.join(folder_path, f)) res = pd.concat([res, temp_df], axis=0, ignore_index=True) # 按行合并更符合多CSV数据拼接逻辑 return res @st.cache def other_st_cache_function(): # 示例返回测试数据 return pd.DataFrame({"col1": [1,2,3], "col2": [4,5,6]}) selected = st.sidebar.radio("选择选项", ["a", "b", "c"]) if selected == "a": # 添加缓存清理按钮 if st.button("刷新数据(清理当前缓存)"): get_data_from_csv.clear() st.success("已清理`get_data_from_csv`的缓存,将加载最新数据") df = get_data_from_csv("my_folder", "data.csv") st.dataframe(df) elif selected == "b": df = other_st_cache_function() st.dataframe(df)
关键说明
- 缓存隔离性:调用
get_data_from_csv.clear()只会操作该函数的缓存池,other_st_cache_function的缓存会保持原样,不会因为这次清理而重新计算。 - 实时更新逻辑:点击按钮后先清理旧缓存,随后重新调用
get_data_from_csv时,就会读取最新的底层CSV文件,而不是复用之前的缓存数据。 - 原代码小修正:顺便调整了原代码中
os.list_dir(应为os.listdir)、文件路径拼接、DataFrame合并方向的问题,确保数据加载逻辑的正确性。
内容的提问来源于stack exchange,提问作者Cecily Mag




