streamlit用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
import os.path
 
import streamlit as st
import pandas as pd
import numpy as np
 
"""
2.1 显示标题
st.title():用于创建页面的主要标题,通常是最大和最显眼的标题。它是在应用的顶部设置的,并且在整个页面中通常只使用一次,用于表示应用的主题或总体内容。
st.header():用于创建一个相对较小的标题,比st.title()稍微小一些。可以在应用中多次使用,用于将内容分成不同的部分或主题。
st.subheader():用于创建相对较小的标题,比st.header()还要小。可以在应用中多次使用,用于在小节内更细致地标识内容。
"""
st.title('这是一个标题')
st.header('这是一个较小的标题')
st.subheader('这是一个相对较小的标题')
st.write('这是写入的文本---Streamlit应用。')
 
"""
2.2 显示文本
st.markdown():用于支持Markdown格式的文本,允许你使用Markdown语法来添加样式、链接、列表等元素。
              它提供更灵活的文本呈现选项,允许你使用Markdown标记来创建富文本内容。
st.text():不支持Markdown语法,只显示纯文本内容
"""
#支持markdown
st.markdown('''
# 静夜思
床前**明月**光,疑是地上霜。
举头望**明月**,低头思故乡。
''')
 
#不支持makdown文本
st.text('''
静夜思
床前明月光,疑是地上霜。
举头望明月,低头思故乡。''')
 
"""
2.3 显示代码段
st.code()调用参数如下:
body:要显示的代码字符串。
language:代码所使用的开发语言,字符串,默认值:python。 如果省略的话,将没有语法高亮效果。
"""
 
st.markdown('**以下为打印的代码:**')
st.code(
    '''
            def bubble_sort(arr):
                n = len(arr)
                # 遍历所有数组元素
                for i in range(n):
                    # 最后 i 个元素已经排好序,不需要再比较
                    for j in range(0, n-i-1):
                        # 如果元素比下一个元素大,则交换它们
                        if arr[j] > arr[j+1]:
                            arr[j], arr[j+1] = arr[j+1], arr[j]
            # 示例使用
            if __name__ == "__main__":
                # 测试数据
                example_list = [64, 34, 25, 12, 22, 11, 90]
                print("原始数组:", example_list)
                # 调用冒泡排序函数
                bubble_sort(example_list)
                print("排序后的数组:", example_list)
            ''',
    language='python')
 
"""
2.4 通用显示方法
st.write():是Streamlit中用于在应用程序中展示文本和数据的通用函数。
           它是一个多功能的函数,可以接受多种类型的参数,包括Markdown格式的字符串、数字、DataFrame、图表等。
"""
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# 字符串
st.write("这是一段文本。")
 
# 数字
st.write(42)
 
# 列表
st.write([1, 2, 3])
 
# 字典
st.write({"key": "value"})
 
# 数据框(DataFrame)
df = pd.DataFrame({"Column 1": [1, 2, 3], "Column 2": ["A", "B", "C"]})
st.write(df)
 
# 多参数用法
st.write("这是一个字符串", 42, [1, 2, 3], {"key": "value"})
 
# 自定义渲染
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
st.write(fig)
 
"""
2.5 显示表格
st.dataframe():以表格的形式呈现数据,支持Pandas的特有功能,如排序、过滤等,并且会自动适应数据框的大小,如果数据框太大,它会自动启用滚动条。
参数如下:
①width:UI元素的期望宽度,单位为像素,类型为Int或None,如果是None的话,Streamlit将基于页面宽度计算元素宽度。
②height:UI元素的期望高度,单位为像素,类型为Int或None。
 
st.table():用于显示通用表格数据,不仅支持Pandas,还可以处理列表、元组等可迭代数据结构。但st.table仅用于显示数据,而不提供诸如排序和过滤等数据框专有功能。
 
"""
import streamlit as st
import pandas as pd
import numpy as np
 
random_data = np.random.rand(15, 6)
df = pd.DataFrame(random_data, columns=[f'Col{i}' for i in range(1, 7)])
 
st.dataframe(df)
st.table(df)
 
"""
另外,st.dataframe还可以传入一个Pandas Styler对象来修改所渲染的DataFrame的样式,例如将每一列的最大值高亮显示:
"""
st.dataframe(df.style.highlight_max(axis=0))
 
"""
2.6 显示JSON
st.json():主要用于展示JSON格式的数据,会自动适应JSON数据的大小,如果数据较大会自动启用滚动条,
           并且可以处理包含嵌套结构的复杂JSON数据,以树状结构的形式展示
"""
st.json({
    'foo': 'bar',
    'baz': 'boz',
    'stuff': [
        'stuff 1',
        'stuff 2',
        'stuff 3',
        'stuff 5',
    ],
})
 
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
 
fig, ax = plt.subplots()
 
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
st.pyplot(fig)
 
# """
# 2.8 显示地图
# st.map():显示地图及叠加的数据点,支持自动居中与自动缩放。
#
# 参数:
# data:要显示的数据,必须包含字段lat、lon、latitude或longitude,可以是DataFrame、Styler、数组以及其他可迭代对象等类型:
# zoom:缩放等级。
# use_container_width (bool): 是否使用容器的整个宽度。如果设置为True,地图将占据整个容器的宽度。
#
# """
import st_leaflet  #必需导入
 
# data = {
#     'latitude': [32.7749, 34.0522, 40.7128],
#     'longitude': [122.4194, 118.2437, 74.0060],
#     'name': ['San Francisco', 'Los Angeles', 'New York']
# }
#
# st.map(data, zoom=4, use_container_width=True)
 
 
# # 创建一个地图中心在纽约市的实例
# m = st_leaflet.map([52.5200, 13.4050], zoom=13)
#
# # 添加一个标记
# m.add_marker([52.5200, 13.4050], open_popup=True, popup="这里是柏林")
#
# # 显示地图
# st.markdown("## Map", unsafe_allow_html=True)
# st.write(m)
#
#
 
"""
st.image():是Streamlit中用于在应用程序中显示图像的函数。它可以接受多种输入格式,包括文件路径、URL、图像的字节数据等。
 
参数如下:
默认参数为st.image(image, caption=None, width=None, use_column_width=False, clamp=False, channels='RGB', format='JPEG')
image:要显示的图像,类型可以是numpy.ndarray,[numpy.ndarray],BytesIO,str,或[str])。单色图像为(w,h)或(w,h,1),彩色图像为(w,h,3),RGBA图像为(w,h,4),也可以指定一个图像url,或url列表
caption:图像标题,字符串。如果显示多幅图像,caption应当是字符串列表。
width:图像宽度,None表示使用图像自身宽度。
use_column_width:如果设置为True,则使用列宽作为图像宽度。
clamp:是否将图像的像素值压缩到有效域(0~255),仅对字节数组图像有效。
channels:图像通道类型,'RGB'或'BGR',默认值:RGB。
format:图像格式:'JPEG'或'PNG'),默认值:JPEG。
"""
 
from PIL import Image
 
image = Image.open('./zzgtest/upload/test.jpg')
 
st.image(image,
         caption='标题',
         width=500
         )
 
"""
2.10 显示视频
st.video():是Streamlit中用于在应用程序中显示视频的函数。它支持多种视频来源,包括本地文件、URL和字节数据。
 
参数:
format(str or None):视频格式,可以是"mp4"、"webm"等。如果设置为None,Streamlit将尝试根据文件扩展名自动识别视频格式。
start_time(int):视频开始播放的时间(以秒为单位)。
"""
 
import streamlit as st
 
# 本地视频
# video_file = open('test.mp4', 'rb')
# video_bytes = video_file.read()
# st.video(video_bytes, format="mp4", start_time=2)
# 网络视频
st.video("http://www.w3school.com.cn/i/movie.mp4")
 
"""#############################################################################################"""
"""
3.1 按钮
st.button():是Streamlit中用于创建按钮的函数。
"""
 
if st.button('点我'):
    st.write('今天是个好日子!')
 
"""
3.2 复选框
st.checkbox():是Streamlit中用于创建复选框的函数
value默认为False,若设置为True,则复选框初始状态即为选中状态。
可以根据需要更改复选框的标签,并根据复选框的状态执行不同的操作,使用户能够通过选择或取消选择来影响应用程序的行为。
"""
import streamlit as st
 
cb = st.checkbox(label='确认', value=False, key='checkbox1')
 
if cb:
    st.write('确认成功')
else:
    st.write('没有确认')
 
"""
3.3 单选框
st.radio():用于创建单选按钮组,使用户能够从一组选项中选择一个。
 
label(str):必需。单选框文本,将显示在按钮组上方,介绍单选框用途。
options(list,tuple,dict,orNone):必需。提供可供选择选项的列表、元组或字典。对于列表或元组,选项将按照它们在列表中的顺序显示。对于字典,将显示字典的键,并将字典的值用作用户选择的实际值。
index(int):可选。单选按钮组的初始选择索引,默认为0。即默认选中第一个选项。
format_func(function or None):可选。用于格式化选项的函数,以便在显示时进行自定义格式。
help(str or None):可选。为单选按钮组提供帮助文本,将在用户悬停在组件上时显示。
 
"""
sex = st.radio(
    label='请输入您的性别',
    options=('男', '女', '保密'),
    index=2,
    format_func=str,
    help='如果您不想透露,可以选择保密'
)
 
if sex == '男':
    st.write('男士您好!')
elif sex == '女':
    st.write('女士您好!')
else:
    st.write('您好!')
 
 
"""
3.4 下拉框
st.selectbox():用于创建一个下拉选择框,使用户能够从一组选项中选择一个。
st.selectbox参数与st.radio一致。
"""
sex = st.selectbox(
    label='请输入您的性别',
    options=('男', '女', '保密'),
    index=2,
    format_func=str,
    help='如果您不想透露,可以选择保密'
)
 
if sex == '男':
    st.write('男士您好!')
elif sex == '女':
    st.write('女士您好!')
else:
    st.write('您好!')
 
 
"""
3.5 多选框
st.multiselect():用于创建一个多选框,允许用户从一组选项中选择多个。
参数如下:
label:必需。多选框的标签,将显示在多选框上方,用于标识多选框的用途。
options:必需。提供可供选择的选项的列表、元组或字典。对于列表或元组,选项将按照它们在列表中的顺序显示。对于字典,将显示字典的键,并将字典的值用作用户选择的实际值。
default(list, tuple, dict,or None):可选。多选框的初始选择,默认为None。如果提供了默认值,则多选框将在初始时显示这些选项。
format_func:可选。用于格式化选项的函数,以便在显示时进行自定义格式。
help:可选。为多选框提供帮助文本,将在用户悬停在组件上时显示。
"""
 
options = st.multiselect(
    label='请问您喜欢吃什么水果',
    options=('橘子', '苹果', '香蕉', '草莓', '葡萄'),
    default='草莓',   #可以为NONE
    format_func=str,
    help='选择您喜欢吃的水果'
)
 
st.write('您喜欢吃的是', options)
 
 
"""
3.6 滑动拉杆
st.slider():用于创建一个滑块,允许用户在一个范围内选择一个数值。
 
参数如下:
 
label(str):必需。滑块的标签,将显示在滑块上方,用于标识滑块的用途。
min_value(int, float, datetime, or None):可选。滑块的最小值。可以是整数、浮点数或datetime对象。如果未提供,则默认为0。
max_value(int, float, datetime, or None):可选。滑块的最大值。可以是整数、浮点数或datetime对象。如果未提供,则默认为100。
value(int, float, datetime, or tuple):可选。滑块的初始值。可以是单个数值或表示范围的元组。如果提供了元组,用户将能够选择一个范围而不是单个值。
step(int, float, or None):可选。滑块上的步进值,用户可以通过拖动滑块选择。如果未提供,则默认为1。
format:可选。滑块的显示格式。可以是包含"{:.2f}"之类的格式字符串,用于控制显示的小数位数。
key:可选。为滑块分配的唯一键,用于识别和跟踪滑块的状态变化。通常用于确保组件的稳定性。
help:可选。为滑块提供帮助文本,将在用户悬停在组件上时显示。
"""
age=st.slider(label='请输入您的年龄',
                min_value=0,
                max_value=100,
                value=0,
                step=1,
                help="请输入您的年龄"
                )
st.write('您的年龄是', age)
 
"""
3.7 单行文本输入框
streamlit.text_input函数用于创建文本输入框,允许用户输入文本信息。
 
参数如下:
 
label:必需。文本输入框的标签,将显示在输入框上方,用于标识输入框的用途。
value(str):可选。文本输入框的初始值,默认为空字符串。
max_chars(int or None):可选。文本输入框允许的最大字符数。如果未提供,则不设置字符数限制。
help:可选。为文本输入框提供帮助文本,将在用户悬停在组件上时显示。
"""
 
name = st.text_input('请输入用户名', max_chars=100, help='最大长度为100字符',placeholder='max:100')
 
# 根据用户输入进行操作
st.write('您的用户名是', name)
 
 
"""
3.8 数字输入框
st.number_input():用于创建数字输入框,允许用户输入数字。
 
参数如下:
label、format、help与前文一致
min_value(int, float, or None):可选。数字输入框的最小值。如果未提供,则不设置最小值限制。
max_value(int, float, or None):可选。数字输入框的最大值。如果未提供,则不设置最大值限制。
value(int, float, or None):可选。数字输入框的初始值。如果未提供,则默认为None。
step(int, float, or None):可选。数字输入框上的步进值,用户可以通过点击按钮调整。如果未提供,则默认为1。
"""
import streamlit as st
 
age = st.number_input(label='请输入您的年龄',
                      min_value=0,
                      max_value=100,
                      value=0,
                      step=1,
                      help='请输入您的年龄'
                      )
st.write('您的年龄是', age)
 
 
"""
3.9 多行文本输入框
st.text_area():用于创建文本区域,允许用户输入多行文本信息。
 
参数如下:
label、help与前文一致。
value(str):可选。文本区域的初始值,默认为空字符串。
height(int or None):可选。文本区域的高度,表示显示的文本行数。如果未提供,则根据内容自动确定高度。
max_chars(int or None):可选。文本区域允许的最大字符数。如果未提供,则不设置字符数限制。
"""
import streamlit as st
 
text = st.text_area(label='请输入文本',
                    value='请输入...',
                    height=5,
                    max_chars=200,
                    help='最大长度限制为200')
 
st.write('您的输入是', text)
 
 
"""
3.10 日期输入框
st.date_input():用于创建日期输入框,允许用户选择日期。
 
参数如下:
label、help与前文一致
value(datetime.dateorNone):可选。日期输入框的初始值,应为datetime.date类型。如果未提供,则默认为None。
min_value(datetime.date or None):可选。日期输入框的最小值,用户不能选择早于该日期的日期。如果未提供,则不设置最小值限制。
max_value(datetime.date or None):可选。日期输入框的最大值,用户不能选择晚于该日期的日期。如果未提供,则不设置最大值限制。
"""
import streamlit as st
import datetime
 
birthday = st.date_input(label='请输入您的出生年月',
                         value=None,
                         min_value=None,
                         max_value=datetime.date.today(),
                         help='请输入您的出生年月')
 
st.write('您的生日是:', birthday)
 
"""
3.11 时间输入框
st.time_input():用于创建时间输入框,允许用户选择时间。
 
参数如下:
label、help与前文一致。
value(datetime.time or None):可选。时间输入框的初始值,应为datetime.time类型。如果未提供,则默认为None。
step(int or timedelta):可选。时间输入框的时间间隔。
"""
import streamlit as st
from datetime import time
 
t = st.time_input(label='请输入一个时间',
                  value=None,
                  help='请输入一个时间')
 
st.write('您输入的时间是:', t)
 
"""
4.1 提示信息
streamlit提供了多种函数用于显示不同类型的消息,以呈现不同级别的通知和反馈。
 
st.error: 用于显示错误消息。通常用于向用户报告发生的错误或异常。
st.warning: 用于显示警告消息。通常用于向用户提供潜在的问题或需要注意的情况。
st.info: 用于显示一般信息消息。可以用于提供一般性的信息或指导。
st.success: 用于显示成功消息。通常用于向用户报告任务或操作成功完成。
st.exception: 用于显示异常消息。当发生异常时,可以使用此函数将异常信息呈现给用户。
"""
import streamlit as st
 
st.error('错误信息')
 
st.warning('警告信息')
 
st.info('提示信息')
 
st.success('成功信息')
 
st.exception('异常信息')
 
"""
4.2 显示执行状态
st.progress:用于显示一个进度条,可以设置最小值、最大值和当前值。它通常用于表示长时间运行的非阻塞任务的进度。
st.spinner:用于显示一个旋转的加载器,表示任务正在执行。它通常用于表示短时间运行的任务的执行状态。当任务完成时,加载器将自动消失。
"""
 
import streamlit as st
import time
 
progress_bar = st.empty()   #设置一个点位符
 
for i in range(10):
    progress_bar.progress(i / 10, '进度')
    time.sleep(0.5)
 
with st.spinner('加载中...'):
    time.sleep(2)
 
 
"""
4.3 缓存修饰器
@st.cache_data装饰器用于记忆函数的历史执行。当使用@st.cache装饰一个函数时,Streamlit 会将该函数的结果存储在一个缓存中,以便在后续调用中直接返回缓存的结果,而不是重新计算。这可以提高应用程序的性能,特别是在处理大量数据或计算密集型任务时。
 
参数如下:
func:要缓存的函数。如果提供了函数,则会对该函数的计算结果进行缓存。如果为None,则返回一个可以接受函数作为参数的装饰器。
ttl(int or None):必需。缓存的生存时间,以秒为单位。在缓存的生存时间内,对函数的调用将返回缓存的结果而不是重新计算。如果设置为None,缓存将永不过期。
max_entries(int or None):可选。缓存的最大条目数。当达到指定的最大条目数时,新的计算结果将替换最早的计算结果。
show_spinner(bool):可选。当进行缓存计算时,是否显示加载指示器。默认为True。
persist(bool):可选。是否将缓存数据持久化到磁盘。如果为True,数据将在应用程序重新启动时仍然存在。默认为False。
experimental_allow_widgets(bool):可选。是否允许在被缓存的函数中使用Streamlit小部件。默认为False。启用此选项时,可以在被缓存的函数中使用小部件。
hash_funcs(dictorNone):可选。用于指定自定义哈希函数的字典。键是参数名称,值是哈希函数。如果为None,将使用默认哈希函数。
 
"""
import streamlit as st
import time
import pandas as pd
 
 
@st.cache_data
def fetch_data(url):
    time.sleep(5)
    return pd.read_html(url)
 
 
url1 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928'
d1 = fetch_data(url1)
st.write(d1)
 
url2 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928'
d2 = fetch_data(url2)
st.write(d2)
 
st.cache_data.clear()
 
url3 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928'
d3 = fetch_data(url3)
st.write(d3)
 
 
 
# 文本输入
user_input = st.text_input("请输入您的名字", "John Doe")
 
# 滑动条
age = st.slider("请选择您的年龄", 18, 100, 30)
 
# 选择框
job = st.selectbox("请选择您的职业", ["学生", "教师", "工程师", "其他"])
 
st.write(f"Hello, {user_input}!")
st.write(f"您的年龄是 {age},职业是 {job}。")
 
# 假设我们有一些数据
data = pd.DataFrame({
    'first_column': list(range(1, 101)),
    'second_column': np.random.randn(100)
})
 
# 用户选择显示的数据数量
number = st.slider("请选择显示数据的数量", 1, 100, 50)
 
# 显示数据
st.write(data.head(number))
 
import matplotlib.pyplot as plt
 
# 创建一个简单的图表
fig, ax = plt.subplots()
ax.hist(data['second_column'], bins=20)
 
st.pyplot(fig)
 
# 使用列进行布局
col1, col2, col3 = st.columns(3)
with col1:
    st.header("Column 1")
    st.write("这是第一列的内容")
with col2:
    st.header("Column 2")
    with st.expander("点击展开更多信息"):
        st.write("这里是一信息。")
        st.write("这里是一信息。")
 
with col3:
    st.header("Column 3")
    # 使用展开器创建隐藏内容
    with st.expander("点击展开更多信息"):
        st.write("这里是一信息。")
        st.write("这里是一信息。")
        st.write("这里是一细信息。")
 
# 使用展开器创建隐藏内容
with st.expander("点击展开更多信息"):
    st.write("这里是一些可以展开的详细信息。")
    st.write("这里是一些可以展开的详细信息。")
    st.write("这里是一些可以展开的详细信息。")
 
# 状态管理与会话状态
# 为了在应用中管理复杂的用户交互,Streamlit引入了会话状态(session state)的概念。
# 会话状态允许您在用户与应用交互时保持某些信息的状态,这对于创建复杂的交互逻辑至关重要。
# 增加一个计数器
if 'count' not in st.session_state:
    st.session_state.count = 0
 
increment = st.button("增加")
if increment:
    st.session_state.count += 1
 
st.write(f"计数器值:{st.session_state.count}")
 
import requests
 
# 与外部API交互获取数据
try:
    response = requests.get("https://api.example.com/data")
    if response.status_code == 200:
        data = response.json()
        st.write(data)
    else:
        st.error("获取数据失败。")
except Exception as e:
    st.write("连接失败", str(e))
 
# 应用标题
st.title('交互式数据分析应用')
# 文件上传
uploaded_file = st.file_uploader("选择一个py文件", type=['py', 'png', 'jpg', 'jpeg'])
 
if uploaded_file is not None:
    # 获取文件名
    file_name = uploaded_file.name
 
    # 读取文件内容
    file_contents = uploaded_file.read()
 
    # 将文件保存到服务器的特定目录
    file_path = './zzgtest/upload/' + file_name
    print(os.path.abspath(file_path))
 
    # 将文件内容写入到服务器文件系统中
    with open(file_path, "wb") as f:
        f.write(file_contents)
 
    st.write(f"文件 '{file_name}' 已保存到服务器。")
 
# streamlit run ./zzgtest/test-streamlit.py

  

posted @   优雅的代码  阅读(1403)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示