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 |
分类:
python
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~