1. 什么是 Streamlit? #
1.1 Streamlit 简介 #
Streamlit 是一个开源的 Python 框架,专门用于快速构建和共享数据科学和机器学习 Web 应用。
为什么选择 Streamlit?
想象一下,你写了一个 Python 脚本来分析数据,但想要把它展示给其他人看。传统方式需要:
- 学习 HTML、CSS、JavaScript(前端技术)
- 搭建 Web 服务器
- 处理前后端交互
而使用 Streamlit,你只需要:
- 写 Python 代码
- 运行
streamlit run app.py - 自动生成漂亮的 Web 应用!
Streamlit 的核心理念:
- 用 Python 脚本构建 Web 应用:不需要写 HTML/CSS/JavaScript
- 无前端经验要求:专注于 Python 和数据分析
- 实时更新:保存代码后自动刷新页面
- 专注于数据应用:内置图表、数据表格等组件
1.2 Streamlit 能做什么? #
Streamlit 特别适合以下场景:
- 数据可视化:快速创建数据仪表盘
- 机器学习演示:展示模型预测结果
- 数据分析工具:上传数据文件,自动生成分析报告
- 原型开发:快速验证想法,创建概念验证应用
- 教学演示:创建交互式教学工具
1.3 前置知识:Python 基础 #
在学习 Streamlit 之前,你需要掌握:
- Python 基础语法:变量、函数、条件语句、循环
- Python 常用库:pandas(数据处理)、numpy(数值计算)
- 基本概念:函数、模块导入
如果你还不熟悉这些,建议先学习 Python 基础。
2. 安装和第一个应用 #
2.1 安装 Streamlit #
在开始之前,我们需要先安装 Streamlit。
安装步骤:
# 使用 pip 安装 Streamlit
# pip 是 Python 的包管理工具,用于安装第三方库
pip install streamlit验证安装:
# 运行 Streamlit 的示例应用,验证安装是否成功
# 如果安装成功,会自动打开浏览器显示示例应用
streamlit hello常见问题:
- 如果提示
pip命令不存在,可能需要使用pip3或python -m pip - 如果安装速度慢,可以使用国内镜像:
pip install streamlit -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 创建第一个应用 #
让我们创建一个最简单的 Streamlit 应用,体验一下它的强大功能。
创建文件 app.py:
# 导入 Streamlit 库
# streamlit 是 Streamlit 框架的主要模块,通常简写为 st
import streamlit as st
# 显示标题
# title() 函数用于显示大标题,会自动应用样式
st.title("Hello Streamlit!")
# 显示文本内容
# write() 函数是 Streamlit 最常用的显示函数,可以显示文本、数字、列表等
st.write("这是我的第一个 Streamlit 应用")
# 显示 Markdown 格式的文本
# markdown() 函数支持 Markdown 语法,可以显示格式化文本
st.markdown("**恭喜!** 你已经成功创建了第一个 Streamlit 应用!")运行应用:
# 在命令行中运行以下命令
# streamlit run 是运行 Streamlit 应用的命令
# app.py 是你的 Python 文件名
streamlit run app.py运行后,会自动打开浏览器,显示你的应用。每次修改代码并保存后,页面会自动刷新。
应用结构说明:
- 每个 Streamlit 应用都是一个 Python 脚本
- 从上到下执行代码,按顺序显示内容
- 不需要定义
main()函数,直接写代码即可
3. 文本显示组件 #
3.1 标题和文本组件 #
Streamlit 提供了多种文本显示组件,让我们来学习如何使用它们。
标题组件:
st.title():显示大标题(一级标题)st.header():显示二级标题st.subheader():显示三级标题
文本组件:
st.write():最常用的显示函数,可以显示任何内容st.text():显示固定宽度的文本st.markdown():显示 Markdown 格式的文本st.code():显示代码块
完整示例:
# 导入 Streamlit 库
import streamlit as st
# 显示大标题
# title() 会显示一个大的标题,通常用于页面主标题
st.title("我的数据分析应用")
# 显示二级标题
# header() 显示中等大小的标题,用于章节标题
st.header("第一章:数据概览")
# 显示三级标题
# subheader() 显示较小的标题,用于小节标题
st.subheader("1.1 数据基本信息")
# 显示普通文本
# write() 是最灵活的显示函数,可以显示文本、数字、列表、字典等
st.write("这是普通文本内容")
# 显示固定宽度文本
# text() 使用等宽字体显示文本,适合显示代码或数据
st.text("这是固定宽度的文本")
# 显示 Markdown 格式文本
# markdown() 支持 Markdown 语法,可以显示粗体、斜体、列表等
st.markdown("**这是粗体文本**,*这是斜体文本*")
st.markdown("- 列表项 1")
st.markdown("- 列表项 2")
# 显示代码块
# code() 用于显示代码,可以指定语言类型
st.code("""
def hello():
print("Hello, Streamlit!")
""", language='python')
# 显示状态消息
# 这些函数用于显示不同类型的提示信息
st.success("操作成功!") # 绿色成功消息
st.error("发生错误!") # 红色错误消息
st.warning("警告信息!") # 黄色警告消息
st.info("提示信息!") # 蓝色信息消息3.2 前置知识:Markdown 语法 #
Markdown 是一种轻量级标记语言,用于格式化文本。Streamlit 的 st.markdown() 支持 Markdown 语法。
常用 Markdown 语法:
**粗体**:显示粗体文本*斜体*:显示斜体文本# 标题:显示标题(1-6 个 # 表示不同级别)- 列表项:显示无序列表1. 列表项:显示有序列表[链接文本](URL):显示链接
4. 数据展示组件 #
4.1 数据表格 #
Streamlit 提供了强大的数据展示功能,可以轻松显示数据表格、指标和 JSON 数据。
前置知识:pandas DataFrame
在展示数据之前,我们需要了解 pandas 的 DataFrame:
- DataFrame:pandas 中的二维表格数据结构,类似 Excel 表格
- 列(Column):表格的列,每列有名称
- 行(Row):表格的行,每行是一条记录
数据展示组件:
st.dataframe():显示交互式数据表格(可排序、筛选)st.table():显示静态数据表格(不可交互)st.metric():显示指标卡片(带数值和变化)st.json():显示 JSON 格式数据
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
# 创建示例数据
# DataFrame 是 pandas 中的表格数据结构
# 这里创建一个包含姓名、年龄、城市的表格
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'薪资': [8000, 12000, 10000, 15000]
})
# 显示交互式数据表格
# dataframe() 显示可交互的表格,用户可以排序、筛选
# use_container_width=True 表示表格占满容器宽度
st.dataframe(df, use_container_width=True)
# 显示静态数据表格
# table() 显示静态表格,不可交互,但样式更简洁
st.table(df)
# 显示指标卡片
# metric() 用于显示关键指标
# label: 指标名称
# value: 指标值
# delta: 变化量(可选,显示绿色上升或红色下降箭头)
st.metric(
label="平均年龄",
value="29.5岁",
delta="+2.5岁" # 显示上升趋势
)
# 显示多个指标(使用列布局)
# columns() 创建多列布局,参数是列数
col1, col2, col3 = st.columns(3)
# 在第一列显示指标
with col1:
st.metric("总人数", "4人", "+1人")
# 在第二列显示指标
with col2:
st.metric("平均薪资", "¥11,250", "+¥500")
# 在第三列显示指标
with col3:
st.metric("城市数", "4个", "0")
# 显示 JSON 数据
# json() 用于显示 JSON 格式的数据,会自动格式化
data_dict = {
"姓名": "张三",
"年龄": 25,
"城市": "北京",
"技能": ["Python", "数据分析", "机器学习"]
}
st.json(data_dict)
# 显示进度条
# progress() 用于显示进度条
# 参数是 0-100 之间的数值,表示完成百分比
progress_bar = st.progress(0)
# 模拟进度更新
for i in range(100):
# 更新进度条,i+1 表示当前进度(1-100)
progress_bar.progress(i + 1)
# 这里可以添加实际的处理逻辑5. 图表组件 #
5.1 Streamlit 原生图表 #
Streamlit 内置了简单的图表功能,可以快速创建折线图、柱状图等。
原生图表类型:
st.line_chart():折线图st.bar_chart():柱状图st.area_chart():面积图
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
# 创建示例数据
# 生成 100 个数据点,x 从 0 到 99,y 是随机数
np.random.seed(42) # 设置随机种子,确保每次运行结果一致
data = pd.DataFrame({
'x': np.arange(100), # x 轴:0 到 99
'y': np.random.randn(100) # y 轴:100 个随机数
})
# 显示折线图
# line_chart() 创建折线图,自动识别 DataFrame 的列
st.line_chart(data)
# 显示柱状图
# bar_chart() 创建柱状图
st.bar_chart(data)
# 显示面积图
# area_chart() 创建面积图(填充的折线图)
st.area_chart(data)5.2 使用 Plotly 创建高级图表 #
虽然 Streamlit 原生图表简单易用,但功能有限。我们可以使用 Plotly 创建更丰富的交互式图表。
前置知识:Plotly
Plotly 是一个强大的数据可视化库,可以创建交互式图表:
- 交互式:可以缩放、平移、悬停查看数据
- 美观:默认样式就很漂亮
- 功能丰富:支持多种图表类型
安装 Plotly:
pip install plotly完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
# 创建示例数据
# 生成销售数据:日期、销售额、地区
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
data = pd.DataFrame({
'日期': np.random.choice(dates, 100),
'销售额': np.random.randint(1000, 10000, 100),
'地区': np.random.choice(['北京', '上海', '广州', '深圳'], 100)
})
# 使用 Plotly 创建散点图
# px.scatter() 创建散点图
# x, y: 指定 x 轴和 y 轴的列
# color: 根据某个列的值给点着色
# title: 图表标题
fig = px.scatter(
data,
x='日期',
y='销售额',
color='地区',
title='销售额散点图'
)
# 显示图表
# plotly_chart() 用于显示 Plotly 图表
# use_container_width=True 表示图表占满容器宽度
st.plotly_chart(fig, use_container_width=True)
# 创建柱状图
# px.bar() 创建柱状图
region_sales = data.groupby('地区')['销售额'].sum().reset_index()
fig2 = px.bar(
region_sales,
x='地区',
y='销售额',
title='各地区总销售额'
)
st.plotly_chart(fig2, use_container_width=True)
# 创建折线图
# px.line() 创建折线图
daily_sales = data.groupby('日期')['销售额'].sum().reset_index()
fig3 = px.line(
daily_sales,
x='日期',
y='销售额',
title='每日销售额趋势'
)
st.plotly_chart(fig3, use_container_width=True)6. 交互组件 #
6.1 基础交互组件 #
Streamlit 提供了丰富的交互组件,让用户可以与应用进行交互。
常用交互组件:
st.button():按钮st.checkbox():复选框st.radio():单选按钮st.selectbox():下拉选择框st.multiselect():多选框st.slider():滑块st.text_input():文本输入框st.number_input():数字输入框
完整示例:
# 导入 Streamlit 库
import streamlit as st
# 按钮
# button() 创建一个按钮,点击返回 True,否则返回 False
if st.button("点击我"):
# 如果按钮被点击,执行这里的代码
st.write("按钮被点击了!")
# 复选框
# checkbox() 创建复选框,选中返回 True,否则返回 False
agree = st.checkbox("我同意用户协议")
if agree:
# 如果复选框被选中,显示消息
st.write("感谢您的同意!")
# 单选按钮
# radio() 创建单选按钮组
# 第一个参数是标签,第二个参数是选项列表
# 返回选中的选项值
genre = st.radio(
"你最喜欢什么电影类型?",
('喜剧', '动作', '爱情', '科幻')
)
# 显示选中的选项
st.write(f"你选择了:{genre}")
# 下拉选择框
# selectbox() 创建下拉选择框
# 第一个参数是标签,第二个参数是选项列表
option = st.selectbox(
"选择城市",
['北京', '上海', '广州', '深圳', '杭州']
)
st.write(f"你选择了:{option}")
# 多选框
# multiselect() 创建多选框,可以选择多个选项
# 第一个参数是标签,第二个参数是选项列表,default 是默认选中的选项
options = st.multiselect(
"选择技能(可多选)",
['Python', 'JavaScript', 'SQL', 'Java', 'C++'],
default=['Python'] # 默认选中 Python
)
st.write(f"你选择了:{options}")
# 滑块
# slider() 创建滑块,用于选择数值范围
# 第一个参数是标签,min_value 是最小值,max_value 是最大值,value 是默认值
age = st.slider("选择年龄", min_value=0, max_value=100, value=25)
st.write(f"你选择的年龄是:{age}")
# 数字输入框
# number_input() 创建数字输入框
# min_value 和 max_value 限制输入范围
number = st.number_input("输入数字", min_value=0, max_value=100, value=50)
st.write(f"你输入的数字是:{number}")
# 文本输入框
# text_input() 创建单行文本输入框
name = st.text_input("请输入姓名")
if name:
st.write(f"你好,{name}!")
# 文本区域
# text_area() 创建多行文本输入框
text = st.text_area("请输入评论", height=100)
if text:
st.write(f"你的评论:{text}")6.2 日期和时间选择 #
Streamlit 还提供了日期和时间选择组件。
完整示例:
# 导入必要的库
import streamlit as st
from datetime import datetime, date, time
# 日期选择
# date_input() 创建日期选择器
# 可以返回单个日期或日期范围
selected_date = st.date_input("选择日期")
st.write(f"你选择的日期是:{selected_date}")
# 日期范围选择
# 传入一个包含两个日期的列表,可以创建日期范围选择器
date_range = st.date_input(
"选择日期范围",
value=[date(2023, 1, 1), date(2023, 12, 31)]
)
if len(date_range) == 2:
st.write(f"开始日期:{date_range[0]}")
st.write(f"结束日期:{date_range[1]}")
# 时间选择
# time_input() 创建时间选择器
selected_time = st.time_input("选择时间")
st.write(f"你选择的时间是:{selected_time}")6.3 文件上传 #
Streamlit 支持文件上传功能,可以上传 CSV、图片等文件。
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
# 文件上传
# file_uploader() 创建文件上传组件
# type 参数指定允许的文件类型
uploaded_file = st.file_uploader(
"选择文件",
type=['csv', 'txt', 'xlsx']
)
# 如果文件已上传,处理文件
if uploaded_file is not None:
# 显示文件信息
st.write(f"文件名:{uploaded_file.name}")
st.write(f"文件大小:{uploaded_file.size} 字节")
# 如果是 CSV 文件,读取并显示
if uploaded_file.name.endswith('.csv'):
# 读取 CSV 文件
df = pd.read_csv(uploaded_file)
# 显示数据表格
st.dataframe(df)
# 显示数据统计信息
st.write(f"数据行数:{len(df)}")
st.write(f"数据列数:{len(df.columns)}")7. 布局组件 #
7.1 列布局和选项卡 #
Streamlit 提供了多种布局组件,帮助我们组织页面内容。
布局组件:
st.columns():创建多列布局st.tabs():创建选项卡st.expander():创建可展开的内容区域st.container():创建容器
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
# 创建示例数据
data = pd.DataFrame({
'x': np.arange(100),
'y': np.random.randn(100)
})
# 列布局
# columns() 创建多列布局,参数是列数
# 返回一个列对象的列表
col1, col2, col3 = st.columns(3)
# 在第一列显示内容
with col1:
st.metric("温度", "25°C", "+1°C")
# 在第二列显示内容
with col2:
st.metric("湿度", "65%", "-2%")
# 在第三列显示内容
with col3:
st.metric("气压", "1013 hPa", "0")
# 选项卡
# tabs() 创建选项卡,参数是选项卡标签列表
# 返回选项卡对象的列表
tab1, tab2, tab3 = st.tabs(["图表", "数据", "设置"])
# 在第一个选项卡中显示内容
with tab1:
st.subheader("数据图表")
st.line_chart(data)
# 在第二个选项卡中显示内容
with tab2:
st.subheader("数据表格")
st.dataframe(data)
# 在第三个选项卡中显示内容
with tab3:
st.subheader("参数设置")
# 在选项卡中添加交互组件
value = st.slider("参数调节", 0, 100, 50)
st.write(f"当前参数值:{value}")
# 可展开框
# expander() 创建可展开的内容区域,默认折叠
# 点击标题可以展开或折叠内容
with st.expander("点击查看详情"):
st.write("这里是详细信息...")
st.write("可以包含任何内容,如图表、表格等")
# 侧边栏
# sidebar 是 Streamlit 的特殊区域,用于放置控制面板
with st.sidebar:
st.header("控制面板")
# 在侧边栏中添加交互组件
option = st.selectbox("选择选项", ["选项1", "选项2", "选项3"])
st.write(f"当前选择:{option}")8. 状态管理和会话状态 #
8.1 会话状态基础 #
在 Streamlit 中,每次用户交互(如点击按钮)都会重新运行整个脚本。为了保存状态,我们需要使用 st.session_state。
会话状态的作用:
- 保存用户输入的数据
- 保存计算结果
- 实现计数器、购物车等功能
完整示例:
# 导入 Streamlit 库
import streamlit as st
# 初始化会话状态
# session_state 是 Streamlit 提供的状态存储对象
# 类似于字典,可以存储任意数据
# 检查 'counter' 键是否存在,如果不存在则初始化为 0
if 'counter' not in st.session_state:
st.session_state.counter = 0
# 显示当前计数
st.write(f"当前计数:{st.session_state.counter}")
# 增加按钮
# 点击按钮时,counter 加 1
if st.button("增加"):
st.session_state.counter += 1
# rerun() 重新运行脚本,更新显示
st.rerun()
# 减少按钮
if st.button("减少"):
st.session_state.counter -= 1
st.rerun()
# 重置按钮
if st.button("重置"):
st.session_state.counter = 0
st.rerun()
# 使用会话状态保存用户输入
if 'user_name' not in st.session_state:
st.session_state.user_name = ""
# 文本输入框
name = st.text_input("请输入姓名", value=st.session_state.user_name)
# 如果输入改变,更新会话状态
if name != st.session_state.user_name:
st.session_state.user_name = name
# 显示保存的姓名
if st.session_state.user_name:
st.write(f"你好,{st.session_state.user_name}!")8.2 表单和批处理 #
表单可以将多个输入组件组合在一起,只有点击提交按钮时才会处理所有输入。
完整示例:
# 导入 Streamlit 库
import streamlit as st
# 创建表单
# form() 创建一个表单容器
# 表单内的组件不会立即触发脚本重新运行
# 只有点击提交按钮时才会处理
with st.form("my_form"):
st.header("用户注册")
# 在表单中添加输入组件
username = st.text_input("用户名")
password = st.text_input("密码", type="password")
email = st.text_input("邮箱")
# 提交按钮
# form_submit_button() 创建表单提交按钮
# 只有点击这个按钮,submitted 才会变为 True
submitted = st.form_submit_button("提交")
# 如果表单被提交,处理数据
if submitted:
# 验证输入
if username and password and email:
st.success(f"注册成功!用户名:{username}")
# 这里可以添加保存到数据库的逻辑
else:
st.error("请填写所有字段!")9. 缓存优化性能 #
9.1 数据缓存 #
当应用需要加载大量数据或执行耗时计算时,可以使用缓存来提高性能。
缓存的作用:
- 避免重复加载数据
- 避免重复执行耗时计算
- 提高应用响应速度
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import time
# 使用 @st.cache_data 装饰器缓存数据
# 这个装饰器会缓存函数的返回值
# 如果函数参数相同,直接返回缓存的结果,不重新执行函数
@st.cache_data
def load_data():
"""
加载数据函数
使用缓存后,这个函数只会在第一次调用时执行
后续调用会直接返回缓存的结果
"""
# 模拟耗时操作(如读取大文件、查询数据库)
st.write("正在加载数据...")
time.sleep(2) # 模拟 2 秒的加载时间
# 创建示例数据
data = pd.DataFrame({
'id': range(1000),
'value': range(1000)
})
return data
# 调用函数
# 第一次调用会执行函数并缓存结果
data = load_data()
st.dataframe(data)
# 再次调用(参数相同)
# 这次会直接使用缓存,不会重新执行函数
data2 = load_data()
st.write(f"数据行数:{len(data2)}")
# 手动清除缓存
# 如果需要重新加载数据,可以清除缓存
if st.button("清除缓存并重新加载"):
# clear() 清除所有缓存
st.cache_data.clear()
st.rerun()10. 实战示例:数据分析仪表盘 #
10.1 完整的数据分析应用 #
让我们创建一个完整的数据分析仪表盘,整合前面学到的所有知识。
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
# 页面配置
# set_page_config() 必须在脚本最前面调用
# page_title: 浏览器标签页标题
# layout: 布局方式,"wide" 表示宽屏布局
# initial_sidebar_state: 侧边栏初始状态,"expanded" 表示展开
st.set_page_config(
page_title="销售数据分析",
layout="wide",
initial_sidebar_state="expanded"
)
# 标题
st.title("📊 销售数据分析仪表盘")
st.markdown("---") # 分隔线
# 侧边栏:筛选条件
with st.sidebar:
st.header("筛选条件")
# 地区选择(多选)
regions = st.multiselect(
"选择地区",
["华东", "华南", "华北", "华中", "西南", "西北", "东北"],
default=["华东", "华南", "华北"]
)
# 产品类别选择
categories = st.selectbox(
"产品类别",
["全部", "电子产品", "服装", "食品", "家居"]
)
# 更新按钮
update_button = st.button("更新数据", type="primary")
# 加载数据(使用缓存)
@st.cache_data
def load_data():
"""
生成模拟销售数据
使用缓存避免每次重新生成数据
"""
np.random.seed(42)
dates = pd.date_range("2023-01-01", "2023-12-31", freq='D')
# 生成 1000 条销售记录
data = pd.DataFrame({
'date': np.random.choice(dates, 1000),
'region': np.random.choice(["华东", "华南", "华北", "华中", "西南", "西北", "东北"], 1000),
'category': np.random.choice(["电子产品", "服装", "食品", "家居"], 1000),
'sales': np.random.randint(100, 10000, 1000),
'profit': np.random.randint(10, 2000, 1000),
'quantity': np.random.randint(1, 50, 1000)
})
return data
# 加载数据
data = load_data()
# 根据筛选条件过滤数据
if regions:
filtered_data = data[data['region'].isin(regions)]
else:
filtered_data = data
if categories != "全部":
filtered_data = filtered_data[filtered_data['category'] == categories]
# 关键指标(KPI)
st.subheader("关键指标")
col1, col2, col3, col4 = st.columns(4)
# 计算指标
total_sales = filtered_data['sales'].sum()
avg_sales = filtered_data['sales'].mean()
total_orders = len(filtered_data)
avg_profit = filtered_data['profit'].mean()
# 显示指标
with col1:
st.metric("总销售额", f"¥{total_sales:,.0f}")
with col2:
st.metric("平均销售额", f"¥{avg_sales:,.0f}")
with col3:
st.metric("总订单数", f"{total_orders}")
with col4:
st.metric("平均利润", f"¥{avg_profit:,.0f}")
# 图表区域
col1, col2 = st.columns(2)
# 各地区销售额柱状图
with col1:
st.subheader("各地区销售额")
region_sales = filtered_data.groupby('region')['sales'].sum().reset_index()
fig1 = px.bar(
region_sales,
x='region',
y='sales',
color='region',
title='各地区销售额对比'
)
st.plotly_chart(fig1, use_container_width=True)
# 销售趋势折线图
with col2:
st.subheader("销售趋势")
daily_sales = filtered_data.groupby('date')['sales'].sum().reset_index()
fig2 = px.line(
daily_sales,
x='date',
y='sales',
title='每日销售额趋势'
)
st.plotly_chart(fig2, use_container_width=True)
# 详细数据表格
st.subheader("详细数据")
st.dataframe(filtered_data, use_container_width=True)
# 下载按钮
# download_button() 创建下载按钮
# 可以将数据转换为 CSV 格式供用户下载
csv = filtered_data.to_csv(index=False)
st.download_button(
label="下载 CSV 数据",
data=csv,
file_name="sales_data.csv",
mime="text/csv"
)11. 最佳实践和技巧 #
11.1 错误处理 #
在实际应用中,我们需要处理可能出现的错误,提供友好的错误提示。
完整示例:
# 导入必要的库
import streamlit as st
import pandas as pd
# 文件上传
uploaded_file = st.file_uploader("上传 CSV 文件", type=['csv'])
if uploaded_file is not None:
try:
# 尝试读取文件
df = pd.read_csv(uploaded_file)
st.dataframe(df)
st.success("文件加载成功!")
except pd.errors.EmptyDataError:
# 处理空文件错误
st.error("文件为空,请上传有效的 CSV 文件")
except pd.errors.ParserError:
# 处理解析错误
st.error("文件格式错误,请检查 CSV 文件格式")
except Exception as e:
# 处理其他未知错误
st.error(f"发生错误:{str(e)}")
else:
st.info("请上传 CSV 文件")11.2 性能优化建议 #
- 使用缓存:对耗时操作使用 `@st.cache_data
或@st.cache_resource` - 分页显示:对于大量数据,使用分页显示而不是一次性显示所有数据
- 避免重复计算:将计算结果存储在
st.session_state中
12. 学习资源 #
12.1 官方资源 #
- 官方文档:https://docs.streamlit.io
- API 参考:https://docs.streamlit.io/library/api-reference
- 示例应用:https://streamlit.io/gallery
- 社区论坛:https://discuss.streamlit.io
12.2 练习项目建议 #
- 个人简历网站:用 Streamlit 创建交互式简历
- 数据可视化工具:上传 CSV 文件,自动生成图表
- 计算器应用:创建简单的计算器
- 待办事项应用:使用会话状态管理待办事项列表
13. 小结 #
13.1 核心概念回顾 #
- Streamlit:用 Python 快速构建 Web 应用的框架
- 组件:文本、数据、图表、交互组件
- 布局:列布局、选项卡、侧边栏
- 状态管理:使用
st.session_state保存状态 - 缓存:使用 `@st.cache_data` 优化性能
13.2 关键要点 #
- Streamlit 让 Python 开发者无需前端知识就能创建 Web 应用
- 每个 Streamlit 应用都是一个 Python 脚本
- 从上到下执行代码,按顺序显示内容
- 使用会话状态保存用户输入和计算结果
- 使用缓存提高应用性能
13.3 下一步学习 #
掌握了 Streamlit 基础后,你可以:
- 深入学习高级组件和功能
- 学习多页面应用开发
- 学习部署 Streamlit 应用到云端
- 结合数据科学和机器学习创建更复杂的应用
恭喜! 你已经掌握了 Streamlit 的基础知识。现在可以开始创建自己的 Web 应用了!