简介这份资源是面向Python开发者与数据分析初学者的Streamlit实战示例合集聚焦用纯Python快速搭建数据驱动型Web应用无需前端基础即可上手。压缩包共7个文件约518KB以py脚本、jpg图片、txt依赖清单和md说明文档为主其中py脚本承载应用逻辑与自定义组件图片与文本文件用于界面展示和运行配置结构轻量、便于直接运行与二次修改。资源围绕Streamlit核心能力展开涵盖数据读取与清洗、Plotly等可视化图表集成、下拉框与滑块等交互组件调用以及容器化布局和本地部署思路可帮助读者理解入口脚本组织方式与组件复用方法。目前已有2719人学习下载适合希望用较短时间掌握Streamlit开发流程、积累可复用模板的读者参考。1. 从一堆散装脚本到能交付的界面这个 Streamlit 合集到底装了什么手里攒了七八个 Python 小工具每个都能跑但每次演示都得开终端、改路径、对着黑框框敲命令对方看一眼就失去兴趣。这种场景做数据的人太熟了。这个资源就是冲这件事来的一个用 Streamlit 搭起来的网站集合把若干独立功能收进同一套 Web 界面里浏览器打开就能点、能传文件、能看结果。它适合两类人——刚学完 Python 基础、想找个能跑出界面的项目练手的以及手里有零散脚本、想快速包一层可视化外壳的从业者。Streamlit 的核心卖点是不用写前端一个.py文件从上到下执行st.write直接渲染改完保存浏览器提示重跑省掉 Flask 那套路由和模板。这个合集的价值不在单个页面多复杂而在于它示范了多个功能页怎么组织、状态怎么管、部署时哪些参数必须锁死。2. 环境与目录把合集跑起来的最小闭环2.1 依赖安装与版本锁定Streamlit 的版本迭代很快不同版本之间 API 有断裂比如st.experimental_rerun在较新版本里改成了st.rerunst.cache也早就被st.cache_data和st.cache_resource取代。拿到合集后第一件事不是急着streamlit run而是先看有没有requirements.txt没有就自己建一个。# 建虚拟环境避免污染全局包 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装核心依赖版本按合集实际用的锁 pip install streamlit1.32.0 pip install pandas numpy pillow requests逻辑说明虚拟环境是后悔药装崩了直接删目录重来。版本号不要随手写latestStreamlit 小版本升级经常改组件行为合集里某个页面用了旧写法升上去就白屏。参数上streamlit1.32.0只是示例实际以合集requirements.txt为准如果合集没给就先用pip index versions streamlit看可用版本挑一个和代码里 API 对得上的。2.2 目录结构与入口文件一个能维护的 Streamlit 合集目录通常长这样project/ ├── app.py # 主入口负责导航 ├── pages/ # 多页面自动识别目录 │ ├── 1_数据清洗.py │ ├── 2_图表生成.py │ └── 3_文件转换.py ├── utils/ │ ├── loader.py # 数据加载封装 │ └── processor.py # 处理逻辑 ├── requirements.txt └── .streamlit/ └── config.toml # 主题、端口、上传限制Streamlit 有个约定入口文件同级放pages/目录里面的.py文件会自动出现在侧边栏导航文件名前缀数字决定排序。这是合集能做成「网站集合」的关键机制不用自己写路由。启动命令streamlit run app.py --server.port 8501 --server.address 0.0.0.0--server.port指定端口默认 8501--server.address 0.0.0.0让局域网内其他机器能访问只在本机看就写localhost。跑起来后终端会打印本地和网络两个地址浏览器打开即可。2.3 配置文件里必须改的三个参数.streamlit/config.toml是合集部署时最容易忽略的地方默认值在生产场景下会翻车[server] maxUploadSize 200 # 默认 200MB传大文件要调 enableCORS false # 反向代理后面常要关 [theme] base light primaryColor #2E86AB [browser] gatherUsageStats false # 关掉遥测内网环境更干净maxUploadSize单位是 MB默认 200超过直接报错传数据集或视频的页面必须提前调大。gatherUsageStats关掉后不会往外发使用统计内网部署建议关。主题色改primaryColor就能统一按钮和滑块的颜色不用碰 CSS。3. 多页面组织与状态管理合集不散架的核心3.1 用 pages 目录做导航别自己造路由很多人第一次做多页面会在app.py里写一堆if st.sidebar.selectbox(...) 页面A代码越堆越乱刷新还丢状态。Streamlit 原生支持pages/目录自动导航每个文件独立执行互不干扰。# app.py —— 主入口只做首页和全局配置 import streamlit as st st.set_page_config( page_title工具集合, page_icon, layoutwide, initial_sidebar_stateexpanded ) st.title(工具集合首页) st.markdown( 左侧选择具体工具 - 数据清洗上传 CSV去重、补空、导出 - 图表生成选列画图支持折线/柱状/散点 - 文件转换图片格式互转、CSV 转 Excel )st.set_page_config必须是页面里第一个 Streamlit 调用放晚了会报set_page_config() can only be called once。layoutwide让内容占满宽度数据表页面尤其需要默认居中会挤成一条。page_icon支持 emoji 或图片路径。3.2 session_state跨页面不丢数据的黑匣子Streamlit 每次交互都会从头重跑整个脚本普通变量一刷新就归零。st.session_state是唯一能跨重跑保留数据的地方合集里页面之间传参全靠它。import streamlit as st import pandas as pd # 初始化只在第一次运行时执行 if df not in st.session_state: st.session_state.df None if clean_log not in st.session_state: st.session_state.clean_log [] uploaded st.file_uploader(上传 CSV, type[csv]) if uploaded is not None: st.session_state.df pd.read_csv(uploaded) st.session_state.clean_log.append(f已加载 {uploaded.name}) if st.session_state.df is not None: st.write(f当前数据{st.session_state.df.shape[0]} 行) if st.button(去重): before len(st.session_state.df) st.session_state.df st.session_state.df.drop_duplicates() st.session_state.clean_log.append(f去重{before} → {len(st.session_state.df)})逻辑说明if df not in st.session_state是标准初始化写法避免每次重跑都覆盖已有数据。file_uploader返回的是内存中的文件对象pd.read_csv直接读不用先存盘。clean_log用列表累积操作记录跨页面也能读。参数上type[csv]限制上传格式想支持 Excel 就加xlsx但记得装openpyxl。3.3 缓存别让重复计算拖垮页面数据量大时每次交互都重新读文件、重新算页面会卡到没法用。st.cache_data缓存函数返回值输入不变就直接拿结果。import streamlit as st import pandas as pd st.cache_data(ttl600, show_spinner正在加载数据...) def load_data(path: str) - pd.DataFrame: df pd.read_csv(path) df[date] pd.to_datetime(df[date]) return df st.cache_resource def get_db_connection(): import sqlite3 return sqlite3.connect(data.db, check_same_threadFalse)st.cache_data适合 DataFrame、列表、字典这类可序列化的返回值ttl600表示 600 秒后缓存过期文件会更新的话必须设。st.cache_resource适合数据库连接、模型对象这类不能序列化的全局资源只初始化一次。注意缓存函数的参数必须可哈希传 DataFrame 进去会报错要传路径或 ID。4. 避坑与排查合集跑不起来时先看这几条4.1 页面白屏终端没报错现象浏览器打开一片空白终端显示You can now view your Streamlit app但没有任何内容。 原因多半是st.set_page_config没放在最前面或者页面里有语法错误被 Streamlit 吞掉了。 解决把set_page_config挪到 import 之后第一行在终端看有没有SyntaxError或ImportError有就按行号改。还不行就在入口加st.write(debug)确认脚本执行到了哪一步。4.2 上传大文件报File size exceeds limit现象传 300MB 的 CSV页面直接弹红框。 原因config.toml里maxUploadSize默认 200没改。 解决改成maxUploadSize 500或更大重启 Streamlit 生效。注意这个值受服务器内存限制别盲目设成几个 G传进来是读进内存的。4.3 改了代码页面不刷新现象保存.py文件后浏览器没反应还是旧界面。 原因Streamlit 默认监控文件变化但某些编辑器保存方式或网络文件系统下监控失效。 解决右上角菜单点Rerun或终端CtrlC重启。开发时建议在config.toml加runOnSave true保存即重跑。4.4 多页面之间 session_state 读不到现象在页面 A 存了st.session_state.user切到页面 B 读出来是空的。 原因pages/下的每个文件是独立脚本但session_state是全局共享的读不到通常是初始化逻辑写在了页面 A 里页面 B 直接访问未初始化的 key 会报KeyError。 解决把公共状态的初始化抽到utils/里每个页面开头调用一次或者用st.session_state.get(user, None)带默认值读取避免直接下标访问。4.5 部署后端口访问不了现象本地跑得好好的放到服务器上外网打不开。 原因--server.address没设成0.0.0.0只监听了localhost或者防火墙没放行端口。 解决启动命令加--server.address 0.0.0.0确认服务器安全组和防火墙放行了对应端口。用反向代理的话enableCORS和enableXsrfProtection可能要相应调整。5. 进阶技巧把合集做成能长期维护的形态5.1 用st.navigation做条件导航较新版本的 Streamlit 提供了st.navigation比pages/目录更灵活可以根据登录状态动态显示不同页面。import streamlit as st pages { 数据处理: [ st.Page(pages/1_数据清洗.py, title数据清洗), st.Page(pages/2_图表生成.py, title图表生成), ], 系统: [ st.Page(pages/9_设置.py, title设置), ], } pg st.navigation(pages) pg.run()st.Page第一个参数是文件路径title是侧边栏显示名。这样组织的好处是页面分组清晰还能在st.navigation之前加权限判断没登录就只给看登录页。5.2 性能验证用st.profiler和日志定位慢页面合集页面多了以后总有一两个卡得明显。Streamlit 自带 profiler在config.toml里开[profiler] enableProfiling true重启后浏览器地址栏加?profile回车会弹出每个组件的渲染耗时。重点看Slow标记的调用通常是没加缓存的read_csv或循环里的st.write。另一个习惯是在关键函数里打日志import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) st.cache_data def heavy_process(df): logger.info(heavy_process 开始输入 %d 行, len(df)) result df.groupby(category).agg({value: sum}) logger.info(heavy_process 结束输出 %d 行, len(result)) return result日志输出到终端配合?profile能快速定位是数据加载慢还是渲染慢。我一般会在部署前把每个页面点一遍开着 profiler 看有没有超过 1 秒的组件超了就加缓存或分页。5.3 一个具体技巧用st.fragment局部刷新Streamlit 默认整页重跑一个按钮点下去整个页面闪一下。st.fragment能把刷新范围限制在函数内部适合聊天窗口、实时日志这类高频更新的区域。import streamlit as st import time st.fragment(run_every2) def live_clock(): st.write(f当前时间{time.strftime(%H:%M:%S)}) live_clock() st.button(这个按钮不会触发时钟重跑)run_every2表示每 2 秒自动重跑这个 fragment外面的按钮点击不会影响它。参数单位是秒也支持2s、1min这种字符串。注意 fragment 里的session_state读写和外面是同一份别在里面改全局状态导致意外联动。从那以后我每次拿到一个 Streamlit 合集都强制先跑一遍streamlit run看首页能不能出再逐个点开pages/下的页面确认没有 import 错误最后开着 profiler 过一遍性能。这套流程走完交付出去的东西才敢让人直接用。希望帮到你。本文还有配套的精品资源点击获取