本文介绍: 在页面点击组件选择一个文件页面上的上传文件组件数据有了变化,于是页面通知后台重新执行一遍代码,同时页面上传文件组件的文件数据返回给后台,代码开始重新执行第一句代码时,函数返回了页面给的文件数据,因此函数有了返回值,不再是None。千万别忘了,如果没有选择任何工作表,要提前跳出执行看看效果,很不错。方法简单,独定义一个函数接收文件对象函数里面就是 Pandas 加载数据的代码,然后函数上方打上装饰器,表明这是一个缓存函数,为了证明其缓存函数生效我们函数里面打印内容,到控制台

Python界面神器Streamlit使用,一个漂亮的界面有多简单,超乎想象

废话不多说,直接上干货

  1. 首先安装好所需要的库
pip install streamlit
  1. 新建一个 Python 文件(test.py),导入需要的库,
import streamlit as st
import pandas as pd
  1. 打开命令,行输入命令
streamlit run test.py

在这里插入图片描述

  1. 启动服务可以看到输出信息证明已经成功启动了一个服务浏览器自动打开这个地址
    在这里插入图片描述

  2. 现在页面什么东西都没有加一句代码,打印一些文字

import streamlit as st
import pandas as pd
st.text("走过路过不要错过")

保存文件,此时页面右上角出现了一些选项按钮选择总是返回,回到代码修改内容,现在页面可以自动刷新了。
在这里插入图片描述

接下来加一个文件上传组件参数type指定接受的文件后缀名可以指定多种文件类型,所以是一个列表函数返回的是一个文件对象我们可以直接使用 Pandas 读取数据然后试试输出界面上,这里有一个快捷方式直接变量 df写在这里,就会在界面显示成一个表格。不过保存文件后发现页面出现报错信息

uploaded_file = st.file_uploader('excel文件',type=['xlsx'])
df = pd.read_excel(uploaded_file)
st.dataframe(df)

在这里插入图片描述
streamlit每次页面更新都会执行一遍代码,我们没有选择任何文件,所以文件上传组件函数返回了一个None,到了 Pandas 加载数据就会报错
在这里插入图片描述

这里要划重点了。 streamlit与其他框架非常不一样的地方就在于,我们写的代码就像一个描述了整个界面的文档streamlit 每次都要从头到尾执行一次,才能知道画面上应该描绘出哪些内容。因此每当调用一个组件函数,就要注意判断空的情况。这里在上传组件函数之后,判断返回的文件对象是否有东西。这里有一个技巧逻辑,尽可能描述空的情况下,然后跳出执行有专门的函数 stop这个事情,这样可以避免我们的代码出现大量的判断嵌套

uploaded_file= st.file_uploader('excel文件',type=['xlsx'])
if uploaded_file is None:
    st.stop()

在这里插入图片描述

选择一个文件看看效果,可以正常显示。接着我们让 Pandas 一次加载所有的工作表,不需要直接显示数据,而是做一个下拉列表框,让用户选择工作表名字,看看页面效果
在这里插入图片描述
为了让大家更好理解过程我们再次分解其显示过程。第一次执行时,上传文件组件函数由于没有选择任何文件,所以返回none,从而在下面的判断中执行了stop。因此这次执行只收集到上传文件组件的描绘,页面只显示这个组件。在页面上点击组件,选择了一个文件,页面上的上传文件组件数据有了变化,于是页面通知后台重新执行一遍代码,同时页面把上传文件组件的文件数据返回给后台,代码开始重新执行第一句代码时,函数返回了页面给的文件数据,因此函数有了返回值,不再是None。后续的创建下拉选择框的代码也顺利被执行。本次执行结果收集两个组件的创建信息,所以页面上创建了下拉框接下来使用多选下拉框函数返回的列表创建页签,每个页签内创建表格即可。千万别忘了,如果没有选择任何工作表,要提前跳出执行看看效果,很不错。

dfs=pd.read_excel(uploaded_file,None)
names = list(dfs.keys())
sheet_selected = st.multiselect('工作表',names,[])
if len(sheet_selected) == 0:
    st.stop()
tabs = st.tabs(sheet_selected)
for tab,name in zip(tabs,sheet_selected):
    with tab:
        df = dfs[name]
        st.dataframe(df)

根据streamlit的更新规则,不管页面上的任何组件有变化,整个代码都会被重新执行,那就意味着意味着 Pandas 加载数据的代码会被重复执行很多次。实际上数据文件根本没有变化,有没有什么办法可以让它只在我们重新选择其他文件的时候才执行?加载数据?方法简单,独定义一个函数,接收文件对象,函数里面就是 Pandas 加载数据的代码,然后在函数上方打上装饰器,表明这是一个缓存函数,为了证明其缓存函数生效,我们在函数里面打印内容,到控制台

@st.cache_data
def load_data(file):
    print("正在执行加载数据......")
    return pd.read_excel(file,None)
dfs=pd.read_excel(uploaded_file,None)
names = list(dfs.keys())
sheet_selected = st.multiselect('工作表',names,[])
if len(sheet_selected) == 0:
    st.stop()
tabs = st.tabs(sheet_selected)
for tab,name in zip(tabs,sheet_selected):
    with tab:
        df = dfs[name]
        st.dataframe(df)

原文地址:https://blog.csdn.net/weixin_50409347/article/details/129895466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_34840.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注