### Streamlit 文件上传功能详解
在 Streamlit 中,`st.file_uploader` 是用于实现文件上传的核心组件。它允许用户通过图形界面上传各种类型的文件到应用程序中。以下是关于如何使用 `st.file_uploader` 的详细介绍以及一些实用示例。
#### 基本语法
`st.file_uploader` 方法可以接收多个参数来定制其行为。最常用的几个参数如下:
- **label**: 显示给用户的提示文字。
- **type**: 可选的文件类型列表(例如 ['csv', 'xlsx']),限定用户只能上传指定格式的文件。
- **accept_multiple_files**: 是否允许多文件上传,默认为 False。
当用户成功上传文件后,该方法会返回一个类似于字典的对象,其中包含了文件的相关信息和内容流。
```python
import streamlit as st
uploaded_file = st.file_uploader("请选择要上传的文件", type=["txt", "pdf", "png"])
if uploaded_file is not None:
bytes_data = uploaded_file.read()
st.write(f"文件名: {uploaded_file.name}")
st.write(f"文件大小: {len(bytes_data)} 字节")
```
上述代码展示了如何读取并显示已上传文件的基本属性[^3]。
#### 处理不同类型的文件
根据实际需求,可能需要针对特定类型的文件执行不同的操作。下面分别介绍了几种常见场景下的处理方式。
##### 文本文件 (.txt, .log 等)
对于纯文本文件来说,可以直接将其解码成字符串形式以便进一步分析或展示。
```python
text_file = st.file_uploader("上传文本文件", type="txt")
if text_file:
content = text_file.getvalue().decode("utf-8") # 将二进制转换为UTF-8编码的字符串
st.text_area("文件内容预览:", value=content[:500], height=200) # 截断部分内容方便查看
```
##### 表格数据 (CSV 和 Excel 格式)
利用 Pandas 库加载 CSV 或 XLSX 文件非常简便快捷,并且能立即转化为 DataFrame 对象供后续可视化或其他计算任务调用。
```python
import pandas as pd
data_file = st.file_uploader("导入数据分析表单", type=["csv", "xlsx"])
if data_file:
try:
df = pd.read_csv(data_file) if ".csv" in data_file.name else pd.read_excel(data_file)
st.dataframe(df.head(10)) # 展现前几行记录作为样例
except Exception as e:
st.error(f"解析失败,请确认文件格式正确! 错误详情:{e}")
```
此处需要注意的是,在尝试打开未知来源的数据之前最好先做异常捕获以免程序崩溃。
##### 图像资源 (JPEG/PNG/GIF...)
借助 PIL(Pillow) 库可轻松完成图片类素材的操作比如缩放裁剪保存等等动作;另外也可以直接嵌入 HTML img tag 来即时渲染效果出来。
```python
from PIL import Image
image_file = st.file_uploader("挑选一张照片吧!", type=["jpg", "jpeg", "png"])
if image_file:
img = Image.open(image_file).resize((400, 400))
st.image(img, caption='这是您刚刚分享的照片哦~')
```
以上片段说明了怎样调整尺寸后再呈现最终成果给访问者看[^4]。
---
### 综合应用案例 —— 自定义图表生成器
假设我们希望构建这样一个工具:让用户自行提交包含数值型列的一份电子表格文档之后自动绘制对应的折线图或者柱状图之类的统计图形,则整个流程大致如下所示:
```python
import plotly.express as px
def main():
global fig
title = "动态绘图演示平台"
description = """
在这里你可以简单几步就制作属于自己的个性化商业报表啦!\n\n
Step 1. 下载模板 -> 修改填充真实业务指标 -> 回传至系统。\n
Step 2. 设置偏好样式选项——颜色主题、坐标轴范围等细节设定均可自由调节。\n
Step 3. 预览满意即刻导出高清版本PDF/PPT汇报材料咯!"""
with open("./assets/example_template.xlsx","rb") as f:
btn = st.download_button(
label="点击获取空白录入模版",
data=f,
file_name="sample_input_format.xlsx",
mime="application/vnd.ms-excel"
)
upload_zone = st.container()
chart_type_selection = ["Line Chart", "Bar Plot"]
selected_chart_kind = st.selectbox("Pick Your Preferred Graph Type Below.",chart_type_selection)
raw_dataset = upload_zone.file_uploader('Upload your dataset here.', accept_multiple_files=False,type=['xls','xlsx'])
if raw_dataset:
dataframe_representation = process_uploaded_spreadsheet(raw_dataset)
draw_interactive_graph(selected_chart_kind,dataframe_representation)
@st.cache_resource(show_spinner=True,max_entries=None,ttl=60*60)
def process_uploaded_spreadsheet(file_obj):
temp_df = pd.DataFrame()
try:
if '.xls' in str(file_obj.type):
temp_df=pd.read_excel(io=file_obj,index_col=None)
elif'.xlsx'instr(file_obj.type):
temp_df=pd.read_excel(pd.ExcelFile(file_obj),index_col=None,sheet_name=[0])[0]
return clean_and_transform(temp_df)
except ValueError as ve:
raise RuntimeError("Invalid File Format Detected.") from ve
def clean_and_transform(dirty_table):
cleaned_version = dirty_table.dropna(axis=0,how='all').reset_index(drop=True)
transformed_result = ... # Add transformation logic according to project requirements.
return transformed_result
def draw_interactive_graph(chart_style,dynamic_source):
global fig
match chart_style.lower():
case "line chart":
fig = px.line(dynamic_source,x="Date Column Name Here",y="Value Field Title Goes There")
case "bar plot":
fig = px.bar(dynamic_source,x="Category Dimension Label",y="Measure Metric Description")
st.plotly_chart(fig,width=700,height=500)
main()
```
此脚本实现了从原始资料准备到最后成品发布的全流程自动化管理解决方案.
---