<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Python套件 on IT 空間</title><link>https://blog.jiatool.com/series/Python%E5%A5%97%E4%BB%B6/</link><description>Recent content in Python套件 on IT 空間</description><generator>Hugo -- gohugo.io</generator><language>zh</language><managingEditor>jia@jiatool.com (Jia)</managingEditor><webMaster>jia@jiatool.com (Jia)</webMaster><copyright>&amp;copy;{year}, Jia All Rights Reserved</copyright><lastBuildDate>Sat, 01 Feb 2025 17:00:00 +0800</lastBuildDate><atom:link href="https://blog.jiatool.com/series/Python%E5%A5%97%E4%BB%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>透過 Docling 輕鬆解析常見文件，匯出成 JSON、Markdown、HTML 格式</title><link>https://blog.jiatool.com/posts/docling_intro/</link><pubDate>Sat, 01 Feb 2025 17:00:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Tue, 10 Jun 2025 21:55:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/docling_intro/</guid><description>前言 去年底 (2024/11) IBM 最新開源 Docling 工具 (Python 套件)，可以讀取一些常見的文件格式（PDF、DOCX、PPTX、XLSX、圖片、HTML、Markdown&amp;h</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>去年底 (2024/11) IBM 最新開源 Docling 工具 (Python 套件)，可以讀取一些常見的文件格式（PDF、DOCX、PPTX、XLSX、圖片、HTML、Markdown&amp;hellip;）並匯出成 JSON、Markdown、HTML，以及對 PDF 裡的頁面佈局、表格、公式、程式碼&amp;hellip;等等有較好的理解，而且也支援 OCR 辨識。&lt;/p>
&lt;p>我還沒有做太多測試、比較，只是做個簡單的紀錄。&lt;/p>
&lt;br/>
&lt;!--adsense-->
&lt;br/>
&lt;h2 id="安裝套件">安裝套件&lt;/h2>
&lt;p>安裝很簡單，透過 pip 安裝：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install docling
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>* 本文使用 Docling 版本為：v2.17.0&lt;/p>
&lt;br/>
&lt;h2 id="使用教學--範例程式碼">使用教學 &amp;amp; 範例程式碼&lt;/h2>
&lt;p>簡單三步驟：設定來源、轉換文件、輸出結果&lt;/p>
&lt;br/>
&lt;h3 id="設定文件來源">設定文件來源&lt;/h3>
&lt;p>Docling 支援多種格式：PDF、DOCX、PPTX、XLSX、Image、HTML、Markdown、AsciiDoc&lt;br />
參考：&lt;a href="https://docling-project.github.io/docling/usage/supported_formats/">https://docling-project.github.io/docling/usage/supported_formats/&lt;/a>&lt;/p>
&lt;p>輸入可以是網址或本地檔案路徑：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="n">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/pdf/2412.16720&amp;#34;&lt;/span> &lt;span class="c1"># PDF path or URL&lt;/span>
&lt;span class="n">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;./docs/測試用.pdf&amp;#34;&lt;/span>
&lt;span class="n">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;./docs/測試用2.docx&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="轉換文件">轉換文件&lt;/h3>
&lt;p>將文件轉換成它定義的 DolingDocument 格式，就會包含文件的像是檔名、文字、表格、圖片&amp;hellip;等等資訊。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="c1"># 簡單快速使用&lt;/span>
&lt;span class="n">converter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">DocumentConverter&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 也可以限制轉換格式&lt;/span>
&lt;span class="c1"># converter = DocumentConverter(&lt;/span>
&lt;span class="c1"># allowed_formats=[InputFormat.PDF, InputFormat.IMAGE, InputFormat.DOCX, InputFormat.PPTX, InputFormat.MD, InputFormat.HTML, InputFormat.ASCIIDOC],&lt;/span>
&lt;span class="c1"># format_options={&lt;/span>
&lt;span class="c1"># InputFormat.PDF: PdfFormatOption(&lt;/span>
&lt;span class="c1"># pipeline_cls=StandardPdfPipeline, backend=PyPdfiumDocumentBackend&lt;/span>
&lt;span class="c1"># ),&lt;/span>
&lt;span class="c1"># InputFormat.DOCX: WordFormatOption(&lt;/span>
&lt;span class="c1"># pipeline_cls=SimplePipeline # , backend=MsWordDocumentBackend&lt;/span>
&lt;span class="c1"># ),&lt;/span>
&lt;span class="c1"># },&lt;/span>
&lt;span class="c1"># )&lt;/span>
&lt;span class="c1"># 預測模型會在首次使用時自動下載，也可以指定事先下載好的資料夾路徑&lt;/span>
&lt;span class="c1"># 在離線環境方便使用&lt;/span>
&lt;span class="c1"># 模型可能是這邊下載：https://huggingface.co/ds4sd/docling-models&lt;/span>
&lt;span class="c1"># 我也不太確定&lt;/span>
&lt;span class="c1"># pipeline_options = PdfPipelineOptions(artifacts_path=&amp;#34;your location&amp;#34;)&lt;/span>
&lt;span class="c1"># converter = DocumentConverter(&lt;/span>
&lt;span class="c1"># format_options={&lt;/span>
&lt;span class="c1"># InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)&lt;/span>
&lt;span class="c1"># }&lt;/span>
&lt;span class="c1"># )&lt;/span>
&lt;span class="c1"># pipeline&lt;/span>
&lt;span class="c1"># https://docling-project.github.io/docling/usage/#adjust-pipeline-features&lt;/span>
&lt;span class="c1"># 開始轉換文件&lt;/span>
&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">converter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">convert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 也可以限制文件頁數和大小&lt;/span>
&lt;span class="c1"># result = converter.convert(source, max_num_pages=10, max_file_size=20971520)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="輸出結果">輸出結果&lt;/h3>
&lt;p>將轉換後的文件輸出成不同的格式，像是純文字、HTML、Markdown 和 JSON：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_text&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_dict&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># json&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_html&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_markdown&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_document_tokens&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># print(result.document.print_element_tree())&lt;/span>
&lt;span class="c1"># print(result.document._export_to_indented_text(max_text_len=16))&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>也可以直接儲存成檔案：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_as_markdown&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./docs/test.md&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_as_html&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./docs/test.html&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_as_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./docs/test.json&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_as_document_tokens&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./docs/test.tokens&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_as_yaml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./docs/test.yaml&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="完整範例程式碼">完整範例程式碼&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling_core.types&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DoclingDocument&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.datamodel.base_models&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">InputFormat&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.document_converter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="p">(&lt;/span>
&lt;span class="n">DocumentConverter&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">PdfFormatOption&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">WordFormatOption&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.datamodel.pipeline_options&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">PdfPipelineOptions&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.pipeline.simple_pipeline&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">SimplePipeline&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.pipeline.standard_pdf_pipeline&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">StandardPdfPipeline&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.backend.pypdfium2_backend&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">PyPdfiumDocumentBackend&lt;/span>
&lt;span class="c1"># source = &amp;#34;https://arxiv.org/pdf/2408.09869&amp;#34; # PDF path or URL&lt;/span>
&lt;span class="c1"># source = &amp;#34;./docs/OpenAIo1SystemCard.pdf.pdf&amp;#34;&lt;/span>
&lt;span class="n">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;./docs/測試文件.docx&amp;#34;&lt;/span>
&lt;span class="n">converter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">DocumentConverter&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># # 可以限制轉換格式&lt;/span>
&lt;span class="c1"># converter = DocumentConverter(&lt;/span>
&lt;span class="c1"># allowed_formats=[InputFormat.PDF, InputFormat.IMAGE, InputFormat.DOCX, InputFormat.PPTX, InputFormat.MD, InputFormat.HTML, InputFormat.ASCIIDOC],&lt;/span>
&lt;span class="c1"># format_options={&lt;/span>
&lt;span class="c1"># InputFormat.PDF: PdfFormatOption(&lt;/span>
&lt;span class="c1"># pipeline_cls=StandardPdfPipeline, backend=PyPdfiumDocumentBackend&lt;/span>
&lt;span class="c1"># ),&lt;/span>
&lt;span class="c1"># InputFormat.DOCX: WordFormatOption(&lt;/span>
&lt;span class="c1"># pipeline_cls=SimplePipeline # , backend=MsWordDocumentBackend&lt;/span>
&lt;span class="c1"># ),&lt;/span>
&lt;span class="c1"># },&lt;/span>
&lt;span class="c1"># )&lt;/span>
&lt;span class="c1"># 開始轉換文件&lt;/span>
&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">converter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">convert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 也可以限制文件頁數和大小&lt;/span>
&lt;span class="c1"># result = converter.convert(source, max_num_pages=10, max_file_size=20971520)&lt;/span>
&lt;span class="c1"># 輸出結果&lt;/span>
&lt;span class="c1"># print(result.document.export_to_text())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export_to_dict&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># print(result.document.export_to_html())&lt;/span>
&lt;span class="c1"># print(result.document.export_to_markdown())&lt;/span>
&lt;span class="c1"># print(result.document.export_to_document_tokens())&lt;/span>
&lt;span class="c1"># print(result.document.print_element_tree())&lt;/span>
&lt;span class="c1"># print(result.document._export_to_indented_text(max_text_len=16))&lt;/span>
&lt;span class="c1"># 直接儲存成檔案&lt;/span>
&lt;span class="c1"># result.document.save_as_markdown(filename=Path(&amp;#34;./docs/test.md&amp;#34;))&lt;/span>
&lt;span class="c1"># result.document.save_as_html(filename=Path(&amp;#34;./docs/test.html&amp;#34;))&lt;/span>
&lt;span class="c1"># result.document.save_as_json(filename=Path(&amp;#34;./docs/test.json&amp;#34;))&lt;/span>
&lt;span class="c1"># result.document.save_as_document_tokens(filename=Path(&amp;#34;./docs/test.tokens&amp;#34;))&lt;/span>
&lt;span class="c1"># result.document.save_as_yaml(filename=Path(&amp;#34;./docs/test.yaml&amp;#34;))&lt;/span>
&lt;span class="c1"># 另一種方法，儲存與讀取&lt;/span>
&lt;span class="c1"># # Save to disk&lt;/span>
&lt;span class="c1"># with open(&amp;#39;./docs/test.json&amp;#39;, &amp;#39;w&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as fp:&lt;/span>
&lt;span class="c1"># json.dump(doc.export_to_dict(), fp, ensure_ascii=False) # use `export_to_dict` to ensure consistency&lt;/span>
&lt;span class="c1"># # Load from disk&lt;/span>
&lt;span class="c1"># with open(&amp;#39;./docs/test.json&amp;#39;, &amp;#39;r&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as f:&lt;/span>
&lt;span class="c1"># doc_dict = json.load(f)&lt;/span>
&lt;span class="c1"># doc = DoclingDocument.model_validate(doc_dict) # use standard pydantic API to populate doc&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="切割-chunk">切割 chunk&lt;/h3>
&lt;p>另外 Docling 也內建切 chunk 的函式，在做 RAG 時會使用到：&lt;a href="https://docling-project.github.io/docling/examples/hybrid_chunking/">https://docling-project.github.io/docling/examples/hybrid_chunking/&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="c1"># 切 chunk&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling.document_converter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DocumentConverter&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">docling_core.transforms.chunker&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HierarchicalChunker&lt;/span> &lt;span class="c1"># 分層分塊器&lt;/span>
&lt;span class="n">conv_res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">DocumentConverter&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">convert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://arxiv.org/pdf/2206.01062&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">doc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">conv_res&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">document&lt;/span>
&lt;span class="n">chunks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HierarchicalChunker&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doc&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunks&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="其他">其他&lt;/h3>
&lt;p>官方文件內有示範多種範例，可以探索還有哪些使用方法：&lt;a href="https://docling-project.github.io/docling/examples/">https://docling-project.github.io/docling/examples/&lt;/a>&lt;/p>
&lt;br/>
&lt;!--adsense-->
&lt;br/>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>除了 Docling，其他類似功能的套件還有像是 &lt;a href="https://github.com/Unstructured-IO/unstructured" target="_blank" rel="noopener">
unstructured
&lt;/a>、&lt;a href="https://github.com/microsoft/markitdown" target="_blank" rel="noopener">
MarkItDown
&lt;/a>、&lt;br />
&lt;a href="https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/" target="_blank" rel="noopener">
PyMuPDF4LLM
&lt;/a>、&lt;a href="https://github.com/opendatalab/MinerU" target="_blank" rel="noopener">
MinerU
&lt;/a>&amp;hellip;，我有空應該也會找時間來試試看。&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://docling-project.github.io/docling/" target="_blank" rel="noopener">
Docling 官方文件
&lt;/a>&lt;br />
&lt;a href="https://github.com/DS4SD/docling" target="_blank" rel="noopener">
Docling GitHub
&lt;/a>&lt;br />
&lt;a href="https://huggingface.co/ds4sd/docling-models" target="_blank" rel="noopener">
ds4sd/docling-models | Hugging Face
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>Embrace the unknown and embrace change. That&amp;rsquo;s where true breakthroughs happen.&lt;br />
擁抱未知，擁抱變化。那才是真正的突破所在！&lt;/p>
&lt;p align="right">—— 黃仁勳 (NVIDIA 共同創辦人暨執行長)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/docling_intro.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/docling_intro_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Docling</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>Streamlit 使用 Nginx 佈署在網址其他路徑</title><link>https://blog.jiatool.com/posts/streamlit_nginx/</link><pubDate>Sat, 09 Nov 2024 20:40:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sat, 09 Nov 2024 20:40:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/streamlit_nginx/</guid><description>前言 當使用 Streamlit 做出一個 web app 之後，除了佈署到 Streamlit Community Cloud，我們也可以自己佈署 (例如使用 Docker、Kubernetes)。 * 之前寫的文章：(</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>當使用 &lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
Streamlit
&lt;/a> 做出一個 web app 之後，除了佈署到 Streamlit Community Cloud，我們也可以自己佈署 (例如使用 Docker、Kubernetes)。&lt;/p>
&lt;p>* 之前寫的文章：&lt;a href="https://blog.jiatool.com/posts/streamlit_2023" target="_blank" rel="noopener">
(2023年新版) 使用 Streamlit 簡單又快速建立 Dashboard 網頁
&lt;/a>&lt;/p>
&lt;br/>
&lt;p>最近剛好有這需求，但我不是要起在根路徑(&lt;code>/&lt;/code>)，而是要指定其他路徑(例如 &lt;code>/myapp&lt;/code>)，這部分會透過 Nginx 去設定。&lt;/p>
&lt;p>不過找了幾篇網路文章，卻還是設定不起來，所以把最終成功的設定分享出來，讓大家少踩一些坑。&lt;/p>
&lt;br/>
&lt;!--adsense-->
&lt;br/>
&lt;h2 id="設定細節">設定細節&lt;/h2>
&lt;p>我需要設定，當其他電腦連到這台主機的某個路徑 (例如 &lt;code>https://mysite.com/myapp&lt;/code>)，它可以轉到 Streamlit app 的 port (例如 &lt;code>http://localhost:8000&lt;/code>)。&lt;/p>
&lt;br/>
&lt;h3 id="環境">環境&lt;/h3>
&lt;p>我是在 Windows 11 裡的 WSL (Linux 系統) 起 Docker 環境，裡面跑 Streamlit app。&lt;/p>
&lt;p>並在 Windows 底下起 Nginx server (v1.24.0)，讓公司內其他電腦可以連到這台的 localhost。&lt;/p>
&lt;br/>
&lt;h3 id="nginx-設定">Nginx 設定&lt;/h3>
&lt;p>因為 Streamlit 有用到 WebSocket，所以還需要多加幾行相關設定。&lt;/p>
&lt;blockquote>
&lt;p>WebSocket 是一種網路傳輸協定，用來在 Server 和 Client 之間建立「持續的雙向通訊」通道，是持續的連線，Server 可以主動向 Client 發送資料，而不需要等待 Client 發出請求。&lt;br />
這使得 WebSocket 特別適合用於即時應用場景，比如即時聊天、線上遊戲等。&lt;/p>
&lt;/blockquote>
&lt;br/>
&lt;p>設定 &lt;code>nginx.conf&lt;/code> 檔案，這個檔案可以到 &lt;code>nginx 安裝路徑&lt;/code>、&lt;code>/usr/local/nginx/conf&lt;/code>、&lt;code>/etc/nginx&lt;/code>、&lt;code>/usr/local/etc/nginx&lt;/code> 找找。&lt;/p>
&lt;pre>&lt;code>http {
...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen 443 ssl;
ssl_certificate &amp;quot;(省略)/conf/certs/demo.pem&amp;quot;;
ssl_certificate_key &amp;quot;(省略)/conf/certs/demo.key&amp;quot;;
# Streamlit app
location /myapp {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
&lt;/code>&lt;/pre>&lt;br/>
&lt;p>&lt;code># Streamlit app&lt;/code> 的部分我還有看到另外一種設定，但在此案例應該沒差(?)：&lt;/p>
&lt;pre>&lt;code> location /myapp/_stcore/stream {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location /myapp {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
&lt;/code>&lt;/pre>&lt;br/>
&lt;h3 id="streamlit-指令">Streamlit 指令&lt;/h3>
&lt;p>這邊是一大重點，因為找到的文章很多都是在說 Nginx 設定，而沒有提到 &lt;code>streamlit run&lt;/code> 也要帶相關參數：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-shell" data-lang="shell">streamlit run streamlit.py --server.port &lt;span class="m">8000&lt;/span> --server.enableCORS &lt;span class="nb">false&lt;/span> --server.enableXsrfProtection &lt;span class="nb">false&lt;/span> --server.baseUrlPath &lt;span class="s2">&amp;#34;myapp&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;br/>
&lt;p>題外話，可以關閉將使用情況統計資料傳送給 Streamlit：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-shell" data-lang="shell">--browser.gatherUsageStats &lt;span class="nb">false&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;!--adsense-->
&lt;br/>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>雖然我不知道這樣設定是不是最好的，但至少對我有效 (🤣&lt;/p>
&lt;br/>
&lt;p>我把找到的幾篇文章都貼在下方參考連結，如果以上的方法還是幫不了你，可以去參考連結翻翻試試。&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://docs.streamlit.io/develop/api-reference/configuration/config.toml" target="_blank" rel="noopener">
config.toml | Streamlit API reference
&lt;/a>&lt;br />
&lt;a href="https://discuss.streamlit.io/t/how-to-use-streamlit-with-nginx/378" target="_blank" rel="noopener">
How to use Streamlit with Nginx? | Streamlit Discuss
&lt;/a>&lt;br />
&lt;a href="https://discuss.streamlit.io/t/deploy-streamlit-with-nginx-with-ssl/61770" target="_blank" rel="noopener">
Deploy Streamlit with NGINX with SSL | Streamlit Discuss
&lt;/a>&lt;br />
&lt;a href="https://discuss.streamlit.io/t/deploy-streamlit-with-nginx-docker/52907" target="_blank" rel="noopener">
Deploy streamlit with nginx + docker | Streamlit Discuss
&lt;/a>&lt;br />
&lt;a href="https://discuss.streamlit.io/t/run-streamlit-app-on-specific-url-path/32147" target="_blank" rel="noopener">
Run streamlit app on specific URL path | Streamlit Discuss
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>平靜的海面造就不出優秀的水手。&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/streamlit_nginx.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/streamlit_nginx_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Streamlit</category><category>Nginx</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>(2023年新版) 使用 Streamlit 簡單又快速建立 Dashboard 網頁</title><link>https://blog.jiatool.com/posts/streamlit_2023/</link><pubDate>Sun, 17 Sep 2023 21:35:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sun, 17 Sep 2023 21:35:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/streamlit_2023/</guid><description>前言 之前寫這篇 Streamlit 的教學文章 已經過去兩年多了，陸續官方還增加了許多功能與優化，而且從我部落格後台的數據來看，發現那篇文章還蠻多人觀看。因此決定</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>之前寫&lt;a href="https://blog.jiatool.com/posts/streamlit" target="_blank" rel="noopener">
這篇 Streamlit 的教學文章
&lt;/a>已經過去兩年多了，陸續官方還增加了許多功能與優化，而且從我部落格後台的數據來看，發現那篇文章還蠻多人觀看。因此決定再寫篇更新的內容，並多補充一些細節。&lt;/p>
&lt;p>此篇文章使用的 Streamlit 是 v1.26.0 版本。&lt;/p>
&lt;br/>
&lt;p>Streamlit 幫助我們快速製作 Web 應用程式，而且不需要任何前端技能，全部都採用 Python 語法完成。讓你輕鬆分享網路爬蟲、數據科學和機器學習的資料，是一個非常方便的套件。&lt;/p>
&lt;p>* 文章最後會附上完整的範例程式碼，請一定看到最後~&lt;/p>
&lt;br/>
&lt;h2 id="demo">Demo&lt;/h2>
&lt;p>這是最後將程式碼放到 GitHub，並使用 Streamlit Cloud 部署的成果。&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">Streamlit 成果範例：&lt;a href="https://jiatool-demo.streamlit.app/">streamlit_2023_demo&lt;/a>&lt;/div>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/demo.jpg" alt="Streamlit Demo 範例" data-caption="Streamlit Demo 範例" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
Streamlit Demo 範例
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="安裝與執行">安裝與執行&lt;/h2>
&lt;ul>
&lt;li>Streamlit [&lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
官方網站
&lt;/a>] [&lt;a href="https://docs.streamlit.io/" target="_blank" rel="noopener">
官方文檔
&lt;/a>]&lt;/li>
&lt;/ul>
&lt;p>安裝&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install streamlit
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>撰寫本篇文章時最新版為：v1.26.0&lt;/p>
&lt;p>執行&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run &amp;lt;py程式檔案路徑&amp;gt;
&lt;span class="c1"># 以我下方文章範例的話，就是：&lt;/span>
streamlit run streamlit_app.py
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>如果想指定 Streamlit 的 port 埠號，只要在後方加上&lt;code>--server.port&lt;/code> 參數：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run &amp;lt;py程式檔案路徑&amp;gt; --server.port &lt;span class="m">8888&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>需要終止該應用程式只需在終端中按 &lt;strong>Ctrl + c&lt;/strong>。&lt;/p>
&lt;br/>
&lt;h2 id="創建-streamlit-應用程式">創建 Streamlit 應用程式&lt;/h2>
&lt;p>除了跟著我以下的文章流程學習，也可以參考 &lt;a href="https://docs.streamlit.io/library/get-started" target="_blank" rel="noopener">
官方文檔 Get started
&lt;/a> 的流程操作。&lt;/p>
&lt;h3 id="新增-py-程式碼">新增 py 程式碼&lt;/h3>
&lt;p>新創建一個 Python 檔案 &lt;code>streamlit_app.py&lt;/code>，以下教學都只會編輯這個檔案。&lt;/p>
&lt;p>打開它，在一開始導入 Streamlit 與範例需要的其他套件：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">streamlit&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">st&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>打開 &amp;quot;命令提示字元&amp;quot; 或 &amp;quot;終端機&amp;quot;，開始執行程式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run streamlit_app.py
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>* 第一次執行時，它可能會問你 Email，這可以不用理它，直接按 Enter 即可。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/streamlit_run_email.png" alt="執行 Streamlit 程式，第一次會遇到 Email" data-caption="執行 Streamlit 程式，第一次會遇到 Email" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
執行 Streamlit 程式，第一次會遇到 Email
&lt;/figcaption>
&lt;/figure>
&lt;p>它應該會顯示如下資訊，並自動開啟一個瀏覽器網頁。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/run_streamlit.png" alt="執行 Streamlit 程式" data-caption="執行 Streamlit 程式" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
執行 Streamlit 程式
&lt;/figcaption>
&lt;/figure>
&lt;p>然後網頁裡面顯示&amp;hellip; 一片空白？！&lt;br />
沒錯！我們又還沒有添加元件進去，怎麼會有東西呢~ 😆&lt;/p>
&lt;br/>
&lt;h3 id="添加文字和數據">添加文字和數據&lt;/h3>
&lt;p>先幫我們的應用程式上個標題，加入以下程式碼：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;我的第一個應用程式&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>存檔，回到瀏覽器的網頁上。&lt;/p>
&lt;p>可以重整網頁，或點擊右上角菜單內 &amp;quot;Rerun&amp;quot; 的按鈕，&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/rerun.jpg" alt="Rerun 重整網頁" data-caption="Rerun 重整網頁" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='350px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:350px;height:;"/>
&lt;figcaption style="text-align: center;">
Rerun 重整網頁
&lt;/figcaption>
&lt;/figure>
&lt;p>網頁上就會顯示一個標題文字了：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/first_title.jpg" alt="試著加入標題吧" data-caption="試著加入標題吧" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
試著加入標題吧
&lt;/figcaption>
&lt;/figure>
&lt;p>如何？簡單吧，那我們再繼續接著下去~&lt;/p>
&lt;br/>
&lt;h3 id="使用-stwrite-和-magic-commands">使用 &lt;code>st.write&lt;/code> 和 Magic Commands&lt;/h3>
&lt;p>在 Streamlit 內有個神奇的指令，他們把它叫 &lt;a href="https://docs.streamlit.io/library/api-reference/write-magic" target="_blank" rel="noopener">
&lt;code>st.write&lt;/code> 和 Magic Commands
&lt;/a>，不管給它 &amp;quot;字串&amp;quot;、&amp;quot;Markdown&amp;quot;、&amp;quot;數據資料&amp;quot; 還是 &amp;quot;圖表&amp;quot;，Streamlit 都會自動辨別並以合適的方式顯示出來。&lt;/p>
&lt;p>在程式碼中只要把想顯示的東西放進 &lt;code>st.write&lt;/code>，甚至單一行只有變數或字串，根本不需要使用 &lt;code>st.write&lt;/code>，它都會自動套用並顯示。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;嘗試創建**表格**：&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">({&lt;/span>
&lt;span class="s1">&amp;#39;first column&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="s1">&amp;#39;second column&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="p">})&lt;/span>
&lt;span class="n">df&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/magic_commands.jpg" alt="呈現 Markdown 與 表格" data-caption="呈現 Markdown 與 表格" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
呈現 Markdown 與 表格
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;p>但是官方有提到有以下三個原因，如果可以的話還是使用更具體的方法比較好：&lt;/p>
&lt;ol>
&lt;li>&lt;code>Magic&lt;/code> 和 &lt;code>st.write()&lt;/code> 會檢查您傳入的數據類型，然後決定如何最好地呈現，但有時你可能想以另一種方式呈現它。&lt;/li>
&lt;li>其他方法返回一個可以使用和修改的對象，可以通過向其添加數據或替換它。&lt;/li>
&lt;li>如果使用更具體的 Streamlit 方法，您可以傳遞其他參數來自定義其行為。&lt;/li>
&lt;/ol>
&lt;br/>
&lt;h3 id="繪製圖表和地圖-chart">繪製圖表和地圖 Chart&lt;/h3>
&lt;h5 id="折線圖-stline_chart">折線圖 &lt;code>st.line_chart()&lt;/code>&lt;/h5>
&lt;p>使用 Numpy 生成一個隨機樣本，然後將其繪製成折線圖。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">chart_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">),&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">line_chart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chart_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>而且它本身有下載、全螢幕觀看等功能。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/line_chart.jpg" alt="繪製折線圖" data-caption="繪製折線圖" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
繪製折線圖
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h5 id="地圖-stmap">地圖 &lt;code>st.map()&lt;/code>&lt;/h5>
&lt;p>使用 Numpy 生成一個隨機樣本，繪製到地圖上。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">map_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">22.6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">120.4&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;lat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;lon&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">map_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/map.jpg" alt="繪製地圖" data-caption="繪製地圖" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
繪製地圖
&lt;/figcaption>
&lt;/figure>
&lt;p>更多圖表元件請參考：&lt;a href="https://docs.streamlit.io/library/api-reference/charts" target="_blank" rel="noopener">
官方文件 Chart elements
&lt;/a>&lt;/p>
&lt;br/>
&lt;h3 id="輸入類元件">輸入類元件&lt;/h3>
&lt;p>除了上述標題、圖表，還有其他小工具，像是按鈕、選擇框、複選框、滑塊等等。&lt;/p>
&lt;br/>
&lt;h5 id="按鈕-stbutton">按鈕 &lt;code>st.button()&lt;/code>&lt;/h5>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">if&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;不要按!&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;不是叫你不要按了嗎！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/button.png" alt="按鈕元件" data-caption="按鈕元件" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
按鈕元件
&lt;/figcaption>
&lt;/figure>
&lt;p>但你可能會注意到，每次點擊按鈕時，上方的折線圖也會產生變化。&lt;br />
這是因為 Streamlit 只要元件有輸入值的改變，整個程式(網頁)就會重新運行，因此折線圖裡的 random 才會出來不同資料。&lt;/p>
&lt;br/>
&lt;h5 id="複選框-stcheckbox">複選框 &lt;code>st.checkbox()&lt;/code>&lt;/h5>
&lt;p>使用複選框來顯示/隱藏數據，例如將剛剛繪製地圖的程式改成：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">if&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">checkbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;顯示地圖圖表&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">map_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">22.6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">120.4&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;lat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;lon&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">map_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h5 id="選擇框-stselectbox">選擇框 &lt;code>st.selectbox()&lt;/code>&lt;/h5>
&lt;p>使用選擇框提供使用者選擇：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">selectbox&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="s1">&amp;#39;你喜歡哪種動物？&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;狗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;貓&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;鸚鵡&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;天竺鼠&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;你的答案：{option}&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/checkbox_selectbox.jpg" alt="複選框 與 選擇框" data-caption="複選框 與 選擇框" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
複選框 與 選擇框
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="調整佈局-layout">調整佈局 Layout&lt;/h3>
&lt;p>除了剛剛示範的一行一個元件，Streamlit 有提供幾種佈局容器元件供使用、排版。&lt;/p>
&lt;br/>
&lt;h5 id="側邊欄-stsidebar">側邊欄 &lt;code>st.sidebar&lt;/code>&lt;/h5>
&lt;p>例如我們能將元件移到側邊欄中，這邊範例將剛剛的選擇框移入側邊欄：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sidebar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">selectbox&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="s1">&amp;#39;你喜歡哪種動物？&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;狗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;貓&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;鸚鵡&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;天竺鼠&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sidebar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;你的答案：{option}&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/sidebar.jpg" alt="將元件移到側邊欄" data-caption="將元件移到側邊欄" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='750px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:750px;height:;"/>
&lt;figcaption style="text-align: center;">
將元件移到側邊欄
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h5 id="列容器-stcolumns">列容器 &lt;code>st.columns()&lt;/code>&lt;/h5>
&lt;p>也有左右兩邊的方式來排列的容器：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">left_column&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">right_column&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">columns&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">left_column&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;這是左邊欄位。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">right_column&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;這是右邊欄位。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h5 id="展開容器-stexpander">展開容器 &lt;code>st.expander()&lt;/code>&lt;/h5>
&lt;p>也可以通過能展開的容器，來隱藏大量內容來節省空間：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">expander&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">expander&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;點擊來展開...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">expander&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;如果你要顯示很多文字，但又不想佔大半空間，可以使用這種方式。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/expander.png" alt="將內容摺疊起來，節省空間" data-caption="將內容摺疊起來，節省空間" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
將內容摺疊起來，節省空間
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h5 id="分頁容器-sttabs">分頁容器 &lt;code>st.tabs()&lt;/code>&lt;/h5>
&lt;p>或者切出不同分頁，來放置不同種類的資料：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">tab1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tab2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tabs&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;Cat 介紹&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Dog 介紹&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="k">with&lt;/span> &lt;span class="n">tab1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;A cat&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">image&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://static.streamlit.io/examples/cat.jpg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">with&lt;/span> &lt;span class="n">tab2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;A dog&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">image&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://static.streamlit.io/examples/dog.jpg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/tabs.jpg" alt="不同分頁，放置不同種類的資料" data-caption="不同分頁，放置不同種類的資料" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
不同分頁，放置不同種類的資料
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;p>其他更多佈局和容器請參考：&lt;a href="https://docs.streamlit.io/library/api-reference/layout" target="_blank" rel="noopener">
官方文件 Layouts and Containers
&lt;/a>&lt;/p>
&lt;br/>
&lt;h3 id="狀態元件-status">狀態元件 Status&lt;/h3>
&lt;h5 id="進度條-stprogress">進度條 &lt;code>st.progress()&lt;/code>&lt;/h5>
&lt;p>使用 &lt;code>time.sleep()&lt;/code> 來模擬進度條的等待：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">bar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">progress&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">bar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">progress&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;目前進度 {i+1} %&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">0.05&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">bar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">progress&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;載入完成！&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>而且網頁右上角還會顯示&amp;quot;RUNNING&amp;hellip;&amp;quot;，並有多個運動圖示跳動，讓使用者知道目前網頁中還有東西正在運行。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/progress.jpg" alt="進度條載入時，網頁右上角 RUNNING... 字樣" data-caption="進度條載入時，網頁右上角 RUNNING... 字樣" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
進度條載入時，網頁右上角 RUNNING... 字樣
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h5 id="消息通知-sttoast">消息通知 &lt;code>st.toast()&lt;/code>&lt;/h5>
&lt;p>當有時候我們會需要跳出一個消息通知使用者，但並不想太干擾使用者，這時候就可以使用 &lt;code>st.toast()&lt;/code>：&lt;/p>
&lt;p>* 也可以為文字加上顏色，和加上 icon。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">if&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;儲存&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;primary&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">toast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;:rainbow[你編輯的內容已經保存]&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;💾&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 或是簡單點，只顯示文字&lt;/span>
&lt;span class="c1"># st.toast(&amp;#39;你編輯的內容已經保存&amp;#39;)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h5 id="box-訊息-stsuccessstinfostwarningsterror">box 訊息 &lt;code>st.success()&lt;/code>、&lt;code>st.info()&lt;/code>、&lt;code>st.warning()&lt;/code>、&lt;code>st.error()&lt;/code>&lt;/h5>
&lt;p>或者想要在頁面上顯示較醒目的錯誤訊息：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">success&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Success!&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">info&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Info!&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">warning&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Warning!&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Error!&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;🚨&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/toast_and_box.jpg" alt="box 訊息 和右下角的 toast 消息" data-caption="box 訊息 和右下角的 toast 消息" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='800px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:800px;height:;"/>
&lt;figcaption style="text-align: center;">
box 訊息 和右下角的 toast 消息
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h5 id="特效-stballoons-與-stsnow">特效 &lt;code>st.balloons()&lt;/code> 與 &lt;code>st.snow()&lt;/code>&lt;/h5>
&lt;p>還有看似無用，但真的好像無用(?)的特效，慶祝氣球 &lt;code>st.balloons()&lt;/code> 與慶祝降雪 &lt;code>st.snow()&lt;/code>：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/balloons.jpg" alt="慶祝氣球特效" data-caption="慶祝氣球特效" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
慶祝氣球特效
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="聊天元件-chat">聊天元件 Chat&lt;/h3>
&lt;h5 id="聊天元件-stchat_message-與-stchat_input">聊天元件 &lt;code>st.chat_message()&lt;/code> 與 &lt;code>st.chat_input()&lt;/code>&lt;/h5>
&lt;p>最近因為 ChatGPT 之類的 LLM 熱門而新增的 &amp;quot;聊天元件&amp;quot; &lt;code>st.chat_message()&lt;/code>、&lt;code>st.chat_input()&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">with&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat_message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1"># 或者寫 &amp;#34;human&amp;#34;&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Hi 👋，請問你是誰？&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 另一種寫法&lt;/span>
&lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat_message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;assistant&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 或者寫 &amp;#34;ai&amp;#34;&lt;/span>
&lt;span class="c1"># message = st.chat_message(&amp;#34;assistant&amp;#34;, avatar=&amp;#34;🦖&amp;#34;) # 自訂頭像&lt;/span>
&lt;span class="n">message&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;你好！我是 ChatBot 🤖，可以回答各種問題，提供資訊。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">message&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;有什麼我可以幫助你的嗎？&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat_input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Say something...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/chat_message.jpg" alt="因應最近 LLM 熱門而新增的聊天元件" data-caption="因應最近 LLM 熱門而新增的聊天元件" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
因應最近 LLM 熱門而新增的聊天元件
&lt;/figcaption>
&lt;/figure>
&lt;p>官方還特別寫兩篇教你如何搭建一個對話式的應用程式，甚至示範如何串接 OpenAI 的 GPT 模型，或透過 LangChain 串接：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps" target="_blank" rel="noopener">
Build conversational apps
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.streamlit.io/knowledge-base/tutorials/llm-quickstart" target="_blank" rel="noopener">
LLM quickstart
&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;h3 id="表單元件">表單元件&lt;/h3>
&lt;h5 id="表單-stform">表單 &lt;code>st.form()&lt;/code>&lt;/h5>
&lt;p>經過上面的嘗試，我們都發現在 Streamlit 中，操作每個元件都會導致整個應用程式重新運行。&lt;/p>
&lt;p>但是，有時我們可能希望像表單那樣，全部填寫好後再一次觸發(提交)，這時候就可以使用 &lt;code>st.form()&lt;/code> 表單元件：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">with&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">form&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;my_form&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">form_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text_input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;姓名&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;請輸入姓名&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">form_gender&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">selectbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;性別&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;男&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;女&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;其他&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">form_birthday&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date_input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;生日&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">submit_button&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">form_submit_button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Submit&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">if&lt;/span> &lt;span class="n">submit_button&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;hello {form_name}, 性別:{form_gender}, 生日:{form_birthday}&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/form.png" alt="使用表單元件，一次一起提交" data-caption="使用表單元件，一次一起提交" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
使用表單元件，一次一起提交
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="使用快取-caching">使用快取 Caching&lt;/h3>
&lt;p>如同前面所述，只要元件輸入值有改變，整個程式(網頁)就會重新運行，但假如有較耗費時間、資源的運算，會造成使用者每調一個參數，就浪費時間在等待，或者產生的物件被重置。&lt;/p>
&lt;p>因此 Streamlit 內提供兩種快取(Caching)機制，將之前運算過的結果快取起來，如果下次遇到一樣的輸入值，就能直接使用之前的結果，節省時間，也有助於在重新運行時持久保存物件。&lt;/p>
&lt;p>這兩種快取機制以裝飾器(Decorator)寫法使用，用途區分如下：&lt;/p>
&lt;ol>
&lt;li>&lt;code>@st.cache_data&lt;/code>：計算後的結果、從 CSV 加載 DataFrame、查詢 API&amp;hellip;，大多情況都可以使用 &lt;code>@st.cache_data&lt;/code>。&lt;/li>
&lt;li>&lt;code>@st.cache_resource&lt;/code>：全域資源，例如 ML 模型或資料庫連接。&lt;/li>
&lt;/ol>
&lt;figure >
&lt;img data-src="https://docs.streamlit.io/images/caching-high-level-diagram.png" alt="Streamlit 提供兩種緩存(Caching)機制" data-caption="Streamlit 提供兩種緩存(Caching)機制" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='550px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:550px;height:;"/>
&lt;figcaption style="text-align: center;">
Streamlit 提供兩種緩存(Caching)機制
&lt;/figcaption>
&lt;/figure>
&lt;p>對於會變動的資料來源，建議可以設定 ttl (time to live)，例如設定 &lt;code>ttl=300&lt;/code>，則快取會在 3600 秒 (1小時) 後失效，並在重新運行函數時，再次執行、緩存快取。&lt;/p>
&lt;p>對於資料量太大造成記憶體可能不足問題，則可以設定 &lt;code>max_entries=1000&lt;/code> 來限制最大資料筆數。&lt;/p>
&lt;p>* 更多說明請參考官方文件：&lt;a href="https://docs.streamlit.io/library/advanced-features/caching" target="_blank" rel="noopener">
Caching
&lt;/a>&lt;/p>
&lt;br/>
&lt;p>要使用 &lt;code>@st.cache_data&lt;/code> 裝飾器，就需要將運算部分的程式碼包成函式(def)。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="nd">@st.cache_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ttl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3600&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">show_spinner&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;正在加載資料...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 👈 Add the caching decorator&lt;/span>
&lt;span class="k">def&lt;/span> &lt;span class="nf">load_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">return&lt;/span> &lt;span class="n">df&lt;/span>
&lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">load_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://raw.githubusercontent.com/plotly/datasets/master/26k-consumer-complaints.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dataframe&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>第一次載入時會跑比較久(上面範例是讓它到網路上下載 csv 資料後顯示)，之後再重整網頁時，因為有快取的關係，它應該一瞬間就顯示出來了。&lt;/p>
&lt;br/>
&lt;p>如果想要清除快取再測試，可以從右上角的選單選擇 &amp;quot;Clear caches&amp;quot;：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/clear_caches.jpg" alt="右上角選單 &amp;#34;Clear caches&amp;#34; 可以清除快取" data-caption="右上角選單 &amp;#34;Clear caches&amp;#34; 可以清除快取" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
右上角選單 &amp;#34;Clear caches&amp;#34; 可以清除快取
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="網頁配置設定">網頁配置設定&lt;/h3>
&lt;div class="alert alert-warning" role="alert" data-dir="ltr">網頁配置程式碼要寫在所有 Streamlit 命令之前，而且只能設定一次。&lt;/div>
&lt;p>此函式有五個參數：&lt;/p>
&lt;ul>
&lt;li>page_title：網頁標題，顯示在瀏覽器分頁的標籤上，預設是程式碼的檔名。&lt;/li>
&lt;li>page_icon：網頁圖標，顯示在網頁標題前，可以使用 &lt;code>st.image&lt;/code> 或 Emoji，或者使用&amp;quot;random&amp;quot;讓它隨機產生XD。&lt;/li>
&lt;li>layout：網頁中佈局寬度，預設是&amp;quot;centered&amp;quot;，還可以使用&amp;quot;wide&amp;quot;。&lt;/li>
&lt;li>initial_sidebar_state：側邊欄顯示狀態，&amp;quot;expanded&amp;quot;打開或&amp;quot;collapsed&amp;quot;隱藏，預設是&amp;quot;auto&amp;quot;，代表在手機尺寸的設備上是隱藏，否則是打開顯示。&lt;/li>
&lt;li>menu_items：右上角的菜單設定，共有以下三項可以設定：
&lt;ul>
&lt;li>&amp;ldquo;Get help&amp;rdquo;：設定 URL，如果沒有，則會隱藏此菜單選項。&lt;/li>
&lt;li>&amp;ldquo;Report a Bug&amp;rdquo;：設定 URL，如果沒有，則會隱藏此菜單選項。&lt;/li>
&lt;li>&amp;ldquo;About&amp;rdquo;：顯示在 &amp;quot;關於&amp;quot; 彈跳視窗中的 Markdown 字串，如果沒有，則僅顯示 Streamlit 預設的內容。&lt;/li>
&lt;li>URL 也可以設定為電子郵件地址，像是 &lt;code>mailto:john@example.com&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>官方文件：&lt;a href="https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config" target="_blank" rel="noopener">
st.set_page_config
&lt;/a>&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/web_page.png" alt="自訂網頁標題與 icon" data-caption="自訂網頁標題與 icon" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
自訂網頁標題與 icon
&lt;/figcaption>
&lt;/figure>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_page_config&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">page_title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;自定義網頁標題&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">page_icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;random&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">layout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;centered&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">initial_sidebar_state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;expanded&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">menu_items&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="s1">&amp;#39;Get Help&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;https://blog.jiatool.com/about/&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;About&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;# 這是什麼網頁？ &lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">**[IT空間](https://blog.jiatool.com/)** 示範 streamlit 之用網頁&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>在網頁右上方選單，除了之前提過的 Rerun 和清除快取，還有網頁設定與螢幕錄影功能，將你的操作流程直接錄影起來，展示給其他人。&lt;/p>
&lt;p>而選單內的&amp;quot;設定&amp;quot;有幾個選項：&lt;/p>
&lt;ul>
&lt;li>Run on save：程式存檔後網頁自動重跑，不需要再手動點 Rerun&lt;/li>
&lt;li>Wide mode：佈局寬度調寬&lt;/li>
&lt;li>Theme：選擇或自訂佈景主題&lt;/li>
&lt;/ul>
&lt;p>* 自定義主題可參考&lt;a href="https://docs.streamlit.io/library/advanced-features/theming" target="_blank" rel="noopener">
官方介紹說明
&lt;/a>。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/settings.jpg" alt="右上角選單 &amp;#34;Settings&amp;#34; 網頁設定" data-caption="右上角選單 &amp;#34;Settings&amp;#34; 網頁設定" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
右上角選單 &amp;#34;Settings&amp;#34; 網頁設定
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="更多的元件工具">更多的元件、工具&lt;/h3>
&lt;p>Streamlit 還有提供更多的元件，和或者其他用途的工具：&lt;/p>
&lt;ul>
&lt;li>連接 &amp;quot;Database 資料庫&amp;quot; 或 &amp;quot;Web API&amp;quot; 取得資料：&lt;a href="https://docs.streamlit.io/library/advanced-features/connecting-to-data" target="_blank" rel="noopener">
Connecting to data
&lt;/a>&lt;/li>
&lt;li>設定主題顏色的配置：&lt;a href="https://docs.streamlit.io/library/advanced-features/theming" target="_blank" rel="noopener">
Theming
&lt;/a>&lt;/li>
&lt;li>做成多頁的應用：&lt;a href="https://docs.streamlit.io/library/get-started/multipage-apps" target="_blank" rel="noopener">
Multipage apps
&lt;/a>&lt;/li>
&lt;li>設定和取得瀏覽器網址列的查詢參數：&lt;a href="https://docs.streamlit.io/library/api-reference/utilities/st.experimental_set_query_params" target="_blank" rel="noopener">
st.experimental_set_query_params()
&lt;/a>、&lt;a href="https://docs.streamlit.io/library/api-reference/utilities/st.experimental_get_query_params" target="_blank" rel="noopener">
st.experimental_get_query_params()
&lt;/a>&lt;/li>
&lt;li>託管靜態文件服務：&lt;a href="https://docs.streamlit.io/library/advanced-features/static-file-serving" target="_blank" rel="noopener">
Static file serving
&lt;/a>&lt;/li>
&lt;li>更多更多元件：&lt;a href="https://docs.streamlit.io/library/api-reference" target="_blank" rel="noopener">
API reference
&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;p>官方有將 streamlit 可以下的指令、各式元件的寫法濃縮整理成一頁，方便快速查閱：&lt;a href="https://cheat-sheet.streamlit.app/">https://cheat-sheet.streamlit.app/&lt;/a>&lt;/p>
&lt;br/>
&lt;h2 id="部署應用程式">部署應用程式&lt;/h2>
&lt;p>除了將程式在自己的電腦執行，或架在伺服器之外，官方有提供「&lt;a href="https://streamlit.io/cloud" target="_blank" rel="noopener">
Streamlit Community Cloud
&lt;/a>」，可以在上面部署、管理、共享你的 Streamlit 應用程式。你只要將專案上傳自己的 GitHub 存儲庫(公開或私有都可以)，再到 Streamlit Community Cloud 設定連接即可，算是蠻方便的。&lt;/p>
&lt;p>* 關於 Streamlit Community Cloud 官方說明可在這邊查看：&lt;a href="https://docs.streamlit.io/streamlit-community-cloud" target="_blank" rel="noopener">
Welcome to Streamlit Community Cloud
&lt;/a>&lt;/p>
&lt;br/>
&lt;p>完整部署介紹請參考&lt;a href="https://docs.streamlit.io/streamlit-community-cloud/deploy-your-app" target="_blank" rel="noopener">
官方說明
&lt;/a>，只需要四個步驟：&lt;/p>
&lt;ol>
&lt;li>先確認你的資料夾內有程式執行需要的&lt;a href="https://docs.streamlit.io/streamlit-community-cloud/deploy-your-app/app-dependencies" target="_blank" rel="noopener">
依賴套件文件
&lt;/a>：
&lt;ul>
&lt;li>Python 依賴文件 [必要]：&lt;code>requirements.txt&lt;/code>、&lt;code>Pipfile&lt;/code>、&lt;code>environment.yml&lt;/code>、&lt;code>pyproject.toml&lt;/code> 這幾種擇一，指定程式需要哪些 Python 套件。&lt;/li>
&lt;li>apt-get 依賴 [非必要]：需要哪些 apt-get 的依賴套件。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>將專案推到自己的 GitHub (公開或私有都可以)。&lt;/li>
&lt;li>前往 &lt;a href="https://share.streamlit.io/" target="_blank" rel="noopener">
share.streamlit.io
&lt;/a> 工作區，連接你剛剛上傳的 GitHub 存儲庫。&lt;/li>
&lt;li>部署完成！！&lt;/li>
&lt;/ol>
&lt;br/>
&lt;p>推上 GitHub 的專案資料夾內大致會長這樣：&lt;/p>
&lt;pre>&lt;code>your-repository/
├── streamlit_app.py
└── requirements.txt
&lt;/code>&lt;/pre>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/github_repository.jpg" alt="推上 GitHub Repository" data-caption="推上 GitHub Repository" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='850px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:850px;height:;"/>
&lt;figcaption style="text-align: center;">
推上 GitHub Repository
&lt;/figcaption>
&lt;/figure>
&lt;p>前往 &lt;a href="https://share.streamlit.io/" target="_blank" rel="noopener">
share.streamlit.io
&lt;/a> 工作區，連接你剛剛上傳的 GitHub 存儲庫。&lt;/p>
&lt;p>點擊右上角 &amp;quot;New app&amp;quot;&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/new_app.jpg" alt="右上角 &amp;#34;New app&amp;#34;" data-caption="右上角 &amp;#34;New app&amp;#34;" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
右上角 &amp;#34;New app&amp;#34;
&lt;/figcaption>
&lt;/figure>
&lt;p>第一次需要給 Streamlit 擁有讀取 GitHub Repository 的權限：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/github_permission.jpg" alt="第一次需要給 Streamlit 讀取 GitHub 權限" data-caption="第一次需要給 Streamlit 讀取 GitHub 權限" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
第一次需要給 Streamlit 讀取 GitHub 權限
&lt;/figcaption>
&lt;/figure>
&lt;p>下一步，指定 GitHub Repository、分支、程式檔案名稱，以及是否要自訂網址名稱(你可以為你的應用程式自訂一個獨一無二的名稱)：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/deploy_setting.jpg" alt="部署設定" data-caption="部署設定" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
部署設定
&lt;/figcaption>
&lt;/figure>
&lt;p>下方還可以打開 &amp;quot;Advanced settings&amp;hellip;&amp;quot;，這邊可以更改 Python 版本、設定環境變數。&lt;br />
我們這個範例不需要編輯這邊。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/advanced_settings.jpg" alt="部署進階設定" data-caption="部署進階設定" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
部署進階設定
&lt;/figcaption>
&lt;/figure>
&lt;p>點擊 &amp;quot;Deploy!&amp;quot;，等個一、兩分鐘安裝。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/deploying.jpg" alt="部署中..." data-caption="部署中..." src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='800px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:800px;height:;"/>
&lt;figcaption style="text-align: center;">
部署中...
&lt;/figcaption>
&lt;/figure>
&lt;p>部署完成，網址列上顯示的就是你這個應用程式的專屬網址，把它分享給其他人炫耀你努力的成果吧~🎉&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/deploy_completed.jpg" alt="部署完成" data-caption="部署完成" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='900px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:900px;height:;"/>
&lt;figcaption style="text-align: center;">
部署完成
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;br/>
&lt;p>前往 &lt;a href="https://share.streamlit.io/" target="_blank" rel="noopener">
share.streamlit.io
&lt;/a> 工作區，可以查看你全部的 Streamlit 應用程式，它還提供統計來訪人數的功能。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/your_apps.jpg" alt="share.streamlit.io 工作區" data-caption="share.streamlit.io 工作區" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='850px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:850px;height:;"/>
&lt;figcaption style="text-align: center;">
share.streamlit.io 工作區
&lt;/figcaption>
&lt;/figure>
&lt;p>來看看我 2021 年發布的 &lt;a href="https://it-jia-streamlit-demo-streamlit-app-t4el3t.streamlit.app/" target="_blank" rel="noopener">
Demo
&lt;/a> 範例，共有 1,522 名讀者來訪~ (而且是計算不重複的)&lt;br />
* 這個統計功能是從 2022 年 4 月才開始，所以實際上會再更多。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit_2023/analytics.jpg" alt="統計來訪人數" data-caption="統計來訪人數" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
統計來訪人數
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h2 id="完整範例程式碼">完整範例程式碼&lt;/h2>
&lt;p>附上完整範例程式碼：&lt;a href="https://github.com/it-jia/streamlit_2023_demo/blob/main/streamlit_app.py" target="_blank" rel="noopener">
streamlit_app.py
&lt;/a>&lt;/p>
&lt;p>此範例程式碼部署在 Streamlit Cloud (share.streamlit.io) 的 Demo：&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">Streamlit 成果範例：&lt;a href="https://jiatool-demo.streamlit.app/">streamlit_2023_demo&lt;/a>&lt;/div>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>從之前第一次嘗試 Streamlit 到現在過了兩年多，它又陸續新增了不少功能，看起來還有積極再發展。&lt;/p>
&lt;p>經過上方教學實際操作後，會發覺這個套件真的可以很簡單、快速的建立一個顯示資料用的儀表板(Dashboard)，因此特別寫這篇文章來分享給大家~&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
Streamlit 官方網站
&lt;/a>&lt;br />
&lt;a href="https://docs.streamlit.io/" target="_blank" rel="noopener">
Streamlit 官方文檔
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>每一個你討厭的現在，&lt;br />
都有一個不夠努力的曾經。&lt;/p>
&lt;p align="right">—— 幾米 (台灣繪本作家)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/streamlit_2023.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/streamlit_2023_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Python</category><category>Streamlit</category><category>Dashboard</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>Playwright 瀏覽器自動化工具，應用於網路爬蟲和測試</title><link>https://blog.jiatool.com/posts/playwright/</link><pubDate>Sat, 20 Nov 2021 21:00:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sat, 20 Nov 2021 21:00:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/playwright/</guid><description>前言 你還在使用 Selenium 來網路爬蟲或自動化測試嗎？或許你可以來試試另一個工具 — Playwright。 (圖片來源：Unsplash) [小廣告] 我製作了</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>你還在使用 Selenium 來網路爬蟲或自動化測試嗎？或許你可以來試試另一個工具 — Playwright。&lt;/p>
&lt;figure >
&lt;img data-src="https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?w=600&amp;amp;q=50" alt="(圖片來源：Unsplash)" data-caption="(圖片來源：Unsplash)" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
(圖片來源：Unsplash)
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">[小廣告] 我製作了一款可愛的「&lt;a href="https://blog.jiatool.com/posts/penguin_wizard_sticker">企鵝魔法師&lt;/a>」貼圖~&lt;br />
歡迎下載：&lt;a href="https://line.me/S/sticker/31703222">LINE 貼圖&lt;/a>、&lt;a href="https://t.me/addstickers/penguin_wizard">Telegram 貼圖 (免費)&lt;/a>&lt;/p>
&lt;img src="https://res.cloudinary.com/jiablog/penguin_wizard_sticker/show.png" caption="企鵝魔法師" width="600px" position="center">&lt;/div>
&lt;h2 id="playwright-套件簡介">Playwright 套件簡介&lt;/h2>
&lt;p>Playwright 是微軟 Microsoft 開發的一個開源瀏覽器自動化工具，可以選擇 Chromium、Firefox、WebKit 瀏覽器，目前有 Python、JavaScript、TypeScript、.NET、Java 的 API 可供使用。&lt;/p>
&lt;p>* 本篇文章以 Python 為範例，但各程式語言的 API 應該是差不多的。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>Linux&lt;/th>
&lt;th>macOS&lt;/th>
&lt;th>Windows&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Chromium 98.0.4708.0&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WebKit 15.4&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Firefox 94.0.1&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>* 此版本會持續更新，以官方文檔為主。&lt;/p>
&lt;br/>
&lt;p>Playwright 第一次輸入指令就會自動下載瀏覽器，與自己使用的瀏覽器是分開的。不用像 Selenium 要手動下載，版本更新還要去更新驅動。&lt;/p>
&lt;br/>
&lt;p>Playwright 在對元素(elements)操作之前，會自動等待元素準備完成(可見的、啟用的&amp;hellip;)，不用怕元素還沒載入就執行造成錯誤，也不需要自己加等待。&lt;/p>
&lt;p>就像省去了 Selenium 內的 WebDriverWait：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">WebDriverWait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">driver&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">until&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">EC&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">presence_of_element_located&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">By&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CSS_SELECTOR&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;#search&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>* 詳細可以參考官方文檔：&lt;a href="https://playwright.dev/python/docs/actionability">https://playwright.dev/python/docs/actionability&lt;/a>&lt;/p>
&lt;br/>
&lt;p>* Playwright 支援同步和異步(搭配 asyncio)，本篇文章皆使用同步來示範。&lt;br />
* Playwright 甚至能自動產生程式碼，這部分可以參考大數學堂的影片教學：&lt;a href="https://www.youtube.com/watch?v=moeAmM-7ybE" target="_blank" rel="noopener">
[爬蟲實戰] 如何不寫任何一行程式碼透過低代碼Low-Code / No-Code 工具 Playwright撰寫網頁自動化瀏覽程式
&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://playwright.dev/python/" target="_blank" rel="noopener">
Playwright 官方網站
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://playwright.dev/python/docs/intro" target="_blank" rel="noopener">
Playwright 文檔
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://playwright.dev/python/docs/api/class-playwright" target="_blank" rel="noopener">
Playwright API
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/microsoft/playwright-python" target="_blank" rel="noopener">
Playwright for Python GitHub
&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;br/>
&lt;h2 id="教學">教學&lt;/h2>
&lt;p>先來試試官方文檔內的基本程式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">from&lt;/span> &lt;span class="nn">playwright.sync_api&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">sync_playwright&lt;/span>
&lt;span class="k">with&lt;/span> &lt;span class="n">sync_playwright&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">page&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">new_page&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">goto&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;http://playwright.dev&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">close&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>首先創造一個瀏覽器實例，開新分頁，再來前往 &lt;code>http://playwright.dev&lt;/code> 網頁，並取得網頁的 title，最後關閉瀏覽器。&lt;/p>
&lt;br/>
&lt;p>它預設是以「無頭模式」啟動，但為了在寫程式時觀察它運作，我們可以先將其關閉：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">headless&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="常見的基本操作">常見的基本操作&lt;/h3>
&lt;p>以下是幾種常見的網頁基本操作：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 點擊&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;div&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 輸入文字&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#search&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 複選框和單選按鈕&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#agree&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 下拉選擇欄&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">select_option&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;select#colors&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;blue&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>更多進階用法與參數可參考官方文檔：&lt;/p>
&lt;ul>
&lt;li>滑鼠 Mouse：&lt;a href="https://playwright.dev/python/docs/api/class-mouse">https://playwright.dev/python/docs/api/class-mouse&lt;/a>&lt;/li>
&lt;li>鍵盤 Keyboard：&lt;a href="https://playwright.dev/python/docs/api/class-keyboard">https://playwright.dev/python/docs/api/class-keyboard&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;h3 id="元素定位">元素定位&lt;/h3>
&lt;p>基本操作或取得元素皆使用 CSS Selector 元素定位。&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">關於 CSS Selector (選擇器)的寫法可以參考我以前整理的文章：&lt;br />
&lt;a href="https://blog.jiatool.com/posts/sorted-out-css-selector/">常用網頁 CSS Selector (選擇器)取得元素，搭配 Python BeautifulSoup 套件&lt;/a>&lt;/div>
&lt;br/>
&lt;p>Playwright 除了有一般的 Selector 用法以外，還有個比較特別且好用的 &amp;quot;文字(text)&amp;quot; 選擇方式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得包含此段文字的元素 (不分大小寫)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;text=Log in&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 取得與此段文字一模一樣的元素 (注意裡面還有引號)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;text=&amp;#34;Log in&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 如果要與 CSS Selector 結合，要使用以下方式&lt;/span>
&lt;span class="c1"># 概念同等於上方的 &amp;#39;text=Log in&amp;#39;，包含此段文字 (不分大小寫)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text(&amp;#34;Log in&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 概念同等於上方的 &amp;#39;text=&amp;#34;Log in&amp;#34;&amp;#39;，文字要完全一樣&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text-is(&amp;#34;Log in&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 使用正則表達式&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text-matches(&amp;#34;[+-]?&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s1">d+&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 還有一種是匹配內部包含文字的任何元素，可能在子元素或後代元素中&lt;/span>
&lt;span class="c1"># 例如底下會匹配 &amp;lt;article&amp;gt;&amp;lt;div&amp;gt;Playwright&amp;lt;/div&amp;gt;&amp;lt;/article&amp;gt;。&lt;/span>
&lt;span class="n">element&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">wait_for_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;article:has-text(&amp;#34;Playwright&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>在文字匹配會對空格進行正規化，例如將多個空格轉換為一個，將換行符變成空格並忽略開頭和結尾的空格。&lt;/p>
&lt;p>因為這部分有多種狀況、較複雜，我只是初步嘗試，如有錯誤歡迎底下留言告知。&lt;br />
參考：&lt;a href="https://playwright.dev/python/docs/selectors/#text-selector">https://playwright.dev/python/docs/selectors/#text-selector&lt;/a>&lt;/p>
&lt;br/>
&lt;p>以及一些其他的選擇方式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 返回 &amp;lt;article&amp;gt; 具有 &amp;lt;div class=promo&amp;gt; 內部元素的文本內容&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text_content&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;article:has(div.promo)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 僅點擊可見 class=button 的元素&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.button:visible&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="選取元素">選取元素&lt;/h3>
&lt;p>如果要取得元素，可以使用：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得元素&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#promo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 取得元素，加入等待&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">wait_for_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#promo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>獲取元素的文字及屬性：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得元素的文字&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;h3&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text_content&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 取得元素的屬性(attribute)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;section&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_attribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;class&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="瀏覽器參數">瀏覽器參數&lt;/h3>
&lt;p>在教學一開始說到無頭模式，在 &lt;code>launch&lt;/code> 加入 &lt;code>headless=False&lt;/code>，它還有其他參數可以設定。&lt;br />
詳見：&lt;a href="https://playwright.dev/python/docs/api/class-browsertype#browser-type-launch">https://playwright.dev/python/docs/api/class-browsertype#browser-type-launch&lt;/a>&lt;/p>
&lt;p>像是傳遞給瀏覽器實例的附加參數，想讓它靜音就使用：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">playwright&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">args&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;--mute-audio&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># 靜音&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>更多 Chromium flags 的列表：&lt;a href="https://peter.sh/experiments/chromium-command-line-switches/">https://peter.sh/experiments/chromium-command-line-switches/&lt;/a>&lt;/p>
&lt;br/>
&lt;h3 id="cookies-和-local-storage">Cookies 和 Local Storage&lt;/h3>
&lt;p>儲存與載入 Cookies 和 Local Storage，可以用作保存登入狀態。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 將存儲狀態保存到文件中&lt;/span>
&lt;span class="n">storage&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">storage_state&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;state.json&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 使用保存的存儲狀態創建新上下文(context)&lt;/span>
&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">new_context&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">storage_state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;state.json&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;!--adsense-->
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>它還有個 GUI 工具 Trace Viewer，可以在程式執行後幫助探索操作過程，感覺非常的厲害，但這部分我就還沒嘗試過，有興趣可以參考：&lt;a href="https://playwright.dev/python/docs/trace-viewer">https://playwright.dev/python/docs/trace-viewer&lt;/a>&lt;/p>
&lt;br/>
&lt;p>Playwright 相比 Selenium 來說是比較新出來的工具(不過都已經是正式版了)，許多功能更好用，如果你原先是使用 Selenium 來寫網路爬蟲或做自動化測試，或許可以試試 Playwright，搞不好你就會愛上囉。😆&lt;/p>
&lt;br/>
&lt;p>歡迎追蹤『&lt;a href="https://www.facebook.com/jiatool" target="_blank" rel="noopener">
IT空間
&lt;/a>』FB 粉專，取得最新發文通知🔔&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://playwright.dev/python/" target="_blank" rel="noopener">
Playwright 官方網站
&lt;/a>&lt;br />
&lt;a href="https://playwright.dev/python/docs/intro" target="_blank" rel="noopener">
Playwright 文檔
&lt;/a>&lt;br />
&lt;a href="https://playwright.dev/python/docs/api/class-playwright" target="_blank" rel="noopener">
Playwright API
&lt;/a>&lt;br />
&lt;a href="https://github.com/microsoft/playwright-python" target="_blank" rel="noopener">
Playwright for Python GitHub
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>對於自己想做的事，就放手去挑戰吧！不是因為覺得能成功就去做，而是發自內心的想要嘗試看看，這樣不管結果如何，自己都不會後悔。&lt;/p>
&lt;p align="right">—— 鈴木一朗 (棒球選手)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/playwright.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/playwright_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Playwright</category><category>瀏覽器</category><category>自動化</category><category>套件</category><category>Python</category><category>分享</category><category>Python套件</category></item><item><title>FinMind API 取得"台股、匯率、黃金"等金融相關資料</title><link>https://blog.jiatool.com/posts/stock_finmind/</link><pubDate>Sun, 17 Oct 2021 20:40:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sun, 17 Oct 2021 20:40:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/stock_finmind/</guid><description>前言 許多人接觸到 Python，開始學習&amp;quot;網路爬蟲 &amp;quot;、&amp;quot;資料分析&amp;quot;、&amp;quot;機器學習&amp;quot;，</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>許多人接觸到 Python，開始學習&amp;quot;&lt;a href="https://blog.jiatool.com/categories/%e7%b6%b2%e8%b7%af%e7%88%ac%e8%9f%b2/" target="_blank" rel="noopener">
網路爬蟲
&lt;/a>&amp;quot;、&amp;quot;資料分析&amp;quot;、&amp;quot;機器學習&amp;quot;，有一部分的人是因為「股票」。但要自己爬取資料確實有點麻煩，而且不同網站可能還有反爬蟲的機制，這對於想要資料來做資料分析、預測股價的人來說，可能就是一個卡在前面的阻礙。&lt;/p>
&lt;p>之前我發現一個 FinMind API，主要以台股為主，提供很多項的金融開源數據，方便讓我們來使用。&lt;/p>
&lt;p>本篇文章會挑幾項功能來說明，以及 Python 範例程式碼。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/chart.jpg" alt="(圖片來源：Unsplash)" data-caption="(圖片來源：Unsplash)" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
(圖片來源：Unsplash)
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="finmind-套件簡介">FinMind 套件簡介&lt;/h2>
&lt;p>FinMind 提供以台股為主，超過 50 種金融相關數據資料，除了 API 可以取得資料、回測、繪製 k 線圖、儀表板，也提供網頁版的操作介面、策略分析與資料集下載功能。&lt;/p>
&lt;p>因為是透過 API 串接，不限制程式，你想要使用 Python、JavaScript、PHP、C++、Java、Ruby&amp;hellip;&amp;hellip;都可，或直接透過它的官網下載資料，對於想要做大數據、資料分析、預測股價的人來說，應該算是一個很方便的工具。&lt;/p>
&lt;br/>
&lt;p>從官方 API 文檔可以看到大概有以下資料：&lt;/p>
&lt;blockquote>
&lt;p>技術面 : 台股股價 daily、歷史 tick 逐筆交易、PER、PBR、每5秒委託成交統計、台股加權指數。&lt;br />
基本面 : 綜合損益表、現金流量表、資產負債表、股利政策表、除權除息結果表、月營收。&lt;br />
籌碼面 : 外資持股、股權分散表、融資融券、三大法人買賣、借券成交明細。&lt;br />
消息面 : 台股相關新聞。&lt;br />
衍生性商品 : 期貨、選擇權 daily data、交易明細、期貨三大法人買賣，期貨各卷商每日交易、選擇權各卷商每日交易。&lt;br />
國際市場 : 美股股價 daily、minute、美國債券殖利率、貨幣發行量(美國)、黃金價格、原油價格、G8 央行利率、G8 匯率、&lt;/p>
&lt;/blockquote>
&lt;p>ℹ 但比較可惜的一點是目前「不提供即時資料」，看文檔的說明是說由於資料源問題，移除即時報價：&lt;a href="https://finmind.github.io/WhatIsNew/">https://finmind.github.io/WhatIsNew/&lt;/a>&lt;/p>
&lt;br/>
&lt;br/>
&lt;h2 id="教學">教學&lt;/h2>
&lt;p>&lt;a href="https://finmind.github.io" target="_blank" rel="noopener">
FinMind API 文檔
&lt;/a> 內都有簡單的程式碼範例，這邊我就挑其中的五種來示範說明。&lt;/p>
&lt;p>程式一開始，先將需要的套件匯入，&lt;code>pandas&lt;/code> 不一定要有(這裡只是拿來方便看資料)：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="股價日成交資訊">股價日成交資訊&lt;/h3>
&lt;p>這項資料就是臺灣證交所的&lt;a href="https://www.twse.com.tw/zh/page/trading/exchange/STOCK_DAY.html" target="_blank" rel="noopener">
個股日成交資訊
&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.finmindtrade.com/api/v4/data&amp;#34;&lt;/span>
&lt;span class="n">parameter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TaiwanStockPrice&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;data_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2330&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-09-13&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;end_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-09-17&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parameter&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">stock_deal_info&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stock_deal_info&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>輸出結果如下：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/output01.png" alt="股價日成交資訊 輸出結果" data-caption="股價日成交資訊 輸出結果" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
股價日成交資訊 輸出結果
&lt;/figcaption>
&lt;/figure>
&lt;p>欄位依序代表：&amp;ldquo;日期&amp;rdquo;、&amp;ldquo;股票代碼&amp;rdquo;、&amp;ldquo;成交股數&amp;rdquo;、&amp;ldquo;成交金額&amp;rdquo;、&amp;ldquo;開盤價&amp;rdquo;、&amp;ldquo;最高價&amp;rdquo;、&amp;ldquo;最低價&amp;rdquo;、&amp;ldquo;收盤價&amp;rdquo;、&amp;ldquo;漲跌價差&amp;rdquo;、&amp;ldquo;成交筆數&amp;rdquo;&lt;/p>
&lt;br/>
&lt;h3 id="股票當日逐筆成交資訊">股票當日逐筆成交資訊&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.finmindtrade.com/api/v4/data&amp;#34;&lt;/span>
&lt;span class="n">parameter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TaiwanStockPriceTick&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;data_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2330&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-09-27&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parameter&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">stock_history_info&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stock_history_info&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tail&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 顯示最後五筆資料&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>輸出結果如下：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/output02.png" alt="股票當日逐筆成交資訊 輸出結果" data-caption="股票當日逐筆成交資訊 輸出結果" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='550px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:550px;height:;"/>
&lt;figcaption style="text-align: center;">
股票當日逐筆成交資訊 輸出結果
&lt;/figcaption>
&lt;/figure>
&lt;p>欄位依序代表：&amp;ldquo;日期&amp;rdquo;、&amp;ldquo;股票代碼&amp;rdquo;、&amp;ldquo;成交金額&amp;rdquo;、&amp;ldquo;成交量&amp;rdquo;、&amp;ldquo;時間&amp;rdquo;、&amp;ldquo;漲跌(1:漲；2跌)&amp;rdquo;&lt;/p>
&lt;br/>
&lt;h3 id="股票綜合損益表">股票綜合損益表&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.finmindtrade.com/api/v4/data&amp;#34;&lt;/span>
&lt;span class="n">parameter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TaiwanStockFinancialStatements&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;data_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2330&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-06-01&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;end_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-09-01&amp;#34;&lt;/span> &lt;span class="c1"># 不加則抓到現在日期&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parameter&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">stock_income_statement&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stock_income_statement&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>輸出結果如下：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/output03.png" alt="股票綜合損益表 輸出結果" data-caption="股票綜合損益表 輸出結果" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='750px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:750px;height:;"/>
&lt;figcaption style="text-align: center;">
股票綜合損益表 輸出結果
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="股利政策表">股利政策表&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.finmindtrade.com/api/v4/data&amp;#34;&lt;/span>
&lt;span class="n">parameter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TaiwanStockDividend&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;data_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2330&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-01-01&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parameter&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">stock_dividend&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stock_dividend&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 顯示前五筆資料&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>輸出結果如下：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/output04.png" alt="股利政策表 輸出結果" data-caption="股利政策表 輸出結果" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='750px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:750px;height:;"/>
&lt;figcaption style="text-align: center;">
股利政策表 輸出結果
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;h3 id="外幣對台幣匯率">外幣對台幣匯率&lt;/h3>
&lt;p>共有 19 種幣別與新臺幣(TWD)的匯率，資料來源為台灣銀行，應該就是&lt;a href="https://rate.bot.com.tw/xrt" target="_blank" rel="noopener">
此網頁
&lt;/a>。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.finmindtrade.com/api/v4/data&amp;#34;&lt;/span>
&lt;span class="n">parameter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TaiwanExchangeRate&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;data_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;USD&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2021-01-01&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parameter&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">exchange_rate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exchange_rate&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tail&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 顯示最後五筆資料&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>輸出結果如下：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/stock_finmind/output05.png" alt="外幣對台幣匯率 輸出結果" data-caption="外幣對台幣匯率 輸出結果" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='550px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:550px;height:;"/>
&lt;figcaption style="text-align: center;">
外幣對台幣匯率 輸出結果
&lt;/figcaption>
&lt;/figure>
&lt;p>欄位依序代表：&amp;ldquo;日期&amp;rdquo;、&amp;ldquo;貨幣&amp;rdquo;、&amp;ldquo;現金匯率&amp;gt;銀行買入&amp;rdquo;、&amp;ldquo;現金匯率&amp;gt;銀行賣出&amp;rdquo;、&amp;ldquo;即期匯率&amp;gt;銀行買入&amp;rdquo;、&amp;ldquo;即期匯率&amp;gt;銀行賣出&amp;rdquo;&lt;/p>
&lt;br/>
&lt;br/>
&lt;h2 id="範例程式碼">範例程式碼&lt;/h2>
&lt;p>我將以上功能包裝成 class 的完整範例程式碼，附上給需要的人參考。&lt;/p>
&lt;p>GitHub Gist：&lt;a href="https://gist.github.com/it-jia/9ca6d3e6922a6804d8ff0a65902d925a" target="_blank" rel="noopener">
stock_finmind.py
&lt;/a>&lt;/p>
&lt;br/>
&lt;br/>
&lt;h2 id="流量限制--會員機制">流量限制 &amp;amp; 會員機制&lt;/h2>
&lt;p>FinMind API 有流量限制，每小時最多 300 次請求，如果註冊成為會員(免費)，則提升至 600 次 / 小時。&lt;/p>
&lt;p>另外還有兩種付款的會員，除了差在每小時的請求限制外，某些功能只有付費會員能使用，例如一次拿特定日期中全部股票的資料。&lt;/p>
&lt;p>更多詳細會員機制的 &amp;quot;贊助方案&amp;quot; 參考官網說明：&lt;a href="https://finmindtrade.com/analysis/#/Sponsor/sponsor">https://finmindtrade.com/analysis/#/Sponsor/sponsor&lt;/a>。&lt;/p>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>以上是直接對 API 請求，如果你是使用 Python，還有官方包裝好的套件(&lt;a href="https://github.com/FinMind/FinMind/" target="_blank" rel="noopener">
GitHub
&lt;/a>)，還幫你寫好幾項量化工具 (回測、K 線、客製化看盤儀表板) 可方便使用。&lt;/p>
&lt;p>更多其他資料或範例，參考 &lt;a href="https://finmind.github.io" target="_blank" rel="noopener">
FinMind API 官方文檔
&lt;/a>。&lt;/p>
&lt;br/>
&lt;p>除了本篇介紹的 FinMind，還有其他許多股票相關的套件可以嘗試：&lt;/p>
&lt;ul>
&lt;li>twstock &lt;a href="https://github.com/mlouielu/twstock">https://github.com/mlouielu/twstock&lt;/a>&lt;/li>
&lt;li>yahooquery &lt;a href="https://github.com/dpguthrie/yahooquery">https://github.com/dpguthrie/yahooquery&lt;/a>&lt;/li>
&lt;li>pandas-datareader &lt;a href="https://github.com/pydata/pandas-datareader">https://github.com/pydata/pandas-datareader&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;p>歡迎追蹤『&lt;a href="https://www.facebook.com/jiatool" target="_blank" rel="noopener">
IT空間
&lt;/a>』FB 粉專，取得最新發文通知🔔&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://finmindtrade.com/" target="_blank" rel="noopener">
FinMind 官方網站
&lt;/a>&lt;br />
&lt;a href="https://finmind.github.io" target="_blank" rel="noopener">
FinMind API 文檔
&lt;/a>&lt;br />
&lt;a href="https://github.com/FinMind/FinMind/" target="_blank" rel="noopener">
FinMind GitHub
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>People at work, money at work.&lt;br />
人可以工作，錢也可以幹活。&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/stock_finmind.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/stock_finmind_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Python</category><category>股票</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>Streamlit 超快速又輕鬆建立網頁 Dashboard</title><link>https://blog.jiatool.com/posts/streamlit/</link><pubDate>Sun, 23 May 2021 20:50:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Wed, 06 Oct 2021 09:40:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/streamlit/</guid><description>前言 後來時隔兩年，我有整理更新的版本，請改去這邊： (2023年新版) 使用 Streamlit 快速又輕鬆建立 Dashboard 網頁 Streamlit 是個可快速製作出 Web 網頁應用程式的套件，而且不</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>後來時隔兩年，我有整理更新的版本，請改去這邊：&lt;br />
&lt;a href="https://blog.jiatool.com/posts/streamlit_2023" target="_blank" rel="noopener">
(2023年新版) 使用 Streamlit 快速又輕鬆建立 Dashboard 網頁
&lt;/a>&lt;/p>
&lt;br/>
&lt;br/>
&lt;p>Streamlit 是個可快速製作出 Web 網頁應用程式的套件，而且不需要任何前端技術，全部都採用 Python 語法，讓你將網路爬蟲、數據科學、機器學習資料簡單地呈現出來分享，是一個很方便的套件。&lt;/p>
&lt;h2 id="demo">Demo&lt;/h2>
&lt;p>這是最後將程式碼放到 GitHub，並使用 Streamlit 部署的成果。&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">Streamlit 成果範例：&lt;a href="https://share.streamlit.io/it-jia/streamlit_demo/streamlit_app.py">streamlit_demo&lt;/a>&lt;/div>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="安裝與執行">安裝與執行&lt;/h2>
&lt;ul>
&lt;li>Streamlit [&lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
官方網站
&lt;/a>] [&lt;a href="https://docs.streamlit.io/en/stable/" target="_blank" rel="noopener">
官方文檔
&lt;/a>]&lt;/li>
&lt;/ul>
&lt;p>安裝&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install streamlit
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>執行&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run &amp;lt;py程式檔案路徑&amp;gt;
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>如果想指定 Streamlit 的 port 埠號，只要在後方加上&lt;code>--server.port&lt;/code> 參數：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run &amp;lt;py程式檔案路徑&amp;gt; --server.port &lt;span class="m">8888&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>需要終止該應用程式只需在終端中按 &lt;strong>Ctrl + c&lt;/strong>。&lt;/p>
&lt;h2 id="範例教學">範例教學&lt;/h2>
&lt;p>底下流程是參考&lt;a href="https://docs.streamlit.io/en/stable/" target="_blank" rel="noopener">
官方文檔
&lt;/a>的流程操作。&lt;/p>
&lt;h3 id="創建一個-streamlit-應用程式">創建一個 Streamlit 應用程式&lt;/h3>
&lt;p>新創建一個 Python 檔案 &lt;code>streamlit_app.py&lt;/code>，以下教學都只會編輯這個檔案。&lt;/p>
&lt;p>打開它，在一開始導入 Streamlit 與其他套件：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">streamlit&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">st&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>打開&amp;quot;命令提示字元&amp;quot;或&amp;quot;終端機&amp;quot;，開始執行程式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">streamlit run streamlit_app.py
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>它應該會顯示如下資訊，並自動開啟一個瀏覽器網頁。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/run_streamlit.png" alt="執行 Streamlit 程式" data-caption="執行 Streamlit 程式" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
執行 Streamlit 程式
&lt;/figcaption>
&lt;/figure>
&lt;p>然後網頁裡面顯示&amp;hellip; 一片空白？！&lt;br />
沒錯！我們又還沒有添加元件進去，怎麼會有東西呢~ 😆&lt;/p>
&lt;h3 id="添加文字和數據">添加文字和數據&lt;/h3>
&lt;p>先幫我們的應用程式加上個標題，加入以下程式碼：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;我的第一個應用程式&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>存檔，回到瀏覽器的網頁上。&lt;br />
可以重整網頁，或點擊右上角&amp;quot;Rerun&amp;quot;的按鈕，&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/rerun.png" alt="網頁重跑" data-caption="網頁重跑" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
網頁重跑
&lt;/figcaption>
&lt;/figure>
&lt;p>網頁上就會顯示一個標題文字了：&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/first_title.png" alt="加入標題" data-caption="加入標題" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
加入標題
&lt;/figcaption>
&lt;/figure>
&lt;p>如何？簡單吧，那我們再繼續接著下去~&lt;/p>
&lt;h3 id="使用-magic-commands">使用 Magic Commands&lt;/h3>
&lt;p>在 Streamlit 內有個神奇的指令，他們把它叫 &lt;a href="https://docs.streamlit.io/en/stable/api.html#magic-commands" target="_blank" rel="noopener">
Magic commands
&lt;/a>，不管你給它&amp;quot;字串&amp;quot;、&amp;quot;Markdown&amp;quot;、&amp;quot;數據資料&amp;quot;、&amp;quot;Matplotlib figures&amp;quot;、&amp;quot;Altair charts&amp;quot;，Streamlit 都會辨別並以合適的方式顯示出來。&lt;/p>
&lt;p>甚至在程式碼中單一行只有變數或字串，根本不需要使用 st.write()，它都會自動套用並顯示。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;嘗試創建**表格**：&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">({&lt;/span>
&lt;span class="s1">&amp;#39;first column&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="s1">&amp;#39;second column&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="p">})&lt;/span>
&lt;span class="n">df&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/magic_commands.jpg" alt="Markdown 與 表格" data-caption="Markdown 與 表格" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
Markdown 與 表格
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="繪製圖表和地圖">繪製圖表和地圖&lt;/h3>
&lt;p>&lt;strong>繪製折線圖&lt;/strong>&lt;br />
使用 Numpy 生成一個隨機樣本，然後將其繪製成圖表。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">chart_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">),&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">line_chart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chart_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>而且它本身有下載、全螢幕觀看等功能。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/line_chart.jpg" alt="繪製折線圖" data-caption="繪製折線圖" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
繪製折線圖
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;p>&lt;strong>繪製地圖&lt;/strong>&lt;br />
使用 Numpy 生成一個隨機樣本，繪製到地圖上。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">map_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">22.7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">120.3&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;lat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;lon&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">map_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/map.jpg" alt="繪製地圖" data-caption="繪製地圖" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
繪製地圖
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="加入小工具">加入小工具&lt;/h3>
&lt;p>除了上述標題、圖表，還有其他小工具，像是複選框、選擇框、按鈕、滑塊等等。&lt;/p>
&lt;p>使用複選框來顯示/隱藏數據，例如在剛剛繪製地圖的程式上方加入：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">if&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">checkbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;顯示地圖圖表&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">map_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">22.7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">120.3&lt;/span>&lt;span class="p">],&lt;/span>
&lt;span class="n">columns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;lat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;lon&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">map_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>但你可能會注意到，每次點擊複選框時，上方的折線圖也會產生變化。&lt;br />
這是因為 Streamlit 只要元件有輸入值的改變，整個程式(網頁)就會重新運行，因此折線圖裡的 random 才會出來不同資料。&lt;/p>
&lt;br/>
&lt;p>使用選擇框進行選擇：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">selectbox&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="s1">&amp;#39;你喜歡哪種動物？&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;狗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;貓&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;鸚鵡&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;天竺鼠&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="s1">&amp;#39;你的答案：&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">option&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/checkbox_selectbox.png" alt="複選框 與 選擇框" data-caption="複選框 與 選擇框" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
複選框 與 選擇框
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="調整佈局">調整佈局&lt;/h3>
&lt;p>我們也能將元件移到側邊欄中，這邊範例將上方選擇框移入側邊欄：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sidebar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">selectbox&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="s1">&amp;#39;你喜歡哪種動物？&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;狗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;貓&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;鸚鵡&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;天竺鼠&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="s1">&amp;#39;你的答案：&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">option&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/sidebar.jpg" alt="將元件移到側邊欄" data-caption="將元件移到側邊欄" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='750px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:750px;height:;"/>
&lt;figcaption style="text-align: center;">
將元件移到側邊欄
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;p>也有左右兩邊的方式來排列：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">left_column&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">right_column&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">beta_columns&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">left_column&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;這是左邊欄位。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">right_column&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;這是右邊欄位。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>或通過 st.beta_expander 來隱藏大量內容來節省空間。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">expander&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">beta_expander&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;點擊來展開...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">expander&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;如果你要顯示很多文字，但又不想佔大半空間，可以使用這種方式。&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/expander.png" alt="將內容摺疊起來" data-caption="將內容摺疊起來" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='650px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:650px;height:;"/>
&lt;figcaption style="text-align: center;">
將內容摺疊起來
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="加入進度條">加入進度條&lt;/h3>
&lt;p>這邊使用 &lt;code>time.sleep()&lt;/code> 來模擬進度：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 增加一個空白元件，等等要放文字&lt;/span>
&lt;span class="n">latest_iteration&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">bar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">progress&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">latest_iteration&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;目前進度 {i+1} %&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">bar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">progress&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>而且網頁右上角還會顯示&amp;quot;RUNNING&amp;hellip;&amp;quot;，並有多個運動圖示跳動，讓使用者知道目前網頁中還有東西正在運行。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/running.png" alt="網頁 RUNNING... 字樣" data-caption="網頁 RUNNING... 字樣" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
網頁 RUNNING... 字樣
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="使用快取">使用快取&lt;/h3>
&lt;p>如同前面所述，只要元件輸入值有改變，整個程式(網頁)就會重新運行，但假如有較耗費時間、資源的運算，會造成使用者每調一個參數，就浪費時間在等。&lt;/p>
&lt;p>因此 Streamlit 內提供一個緩存機制，可以使用 &lt;code>@st.cache&lt;/code> 裝飾器，將之前運算過的結果快取起來，如果下次遇到一樣的輸入值，就能直接使用之前的結果，節省時間。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.streamlit.io/en/stable/caching.html" target="_blank" rel="noopener">
官方說明 Improve app performance
&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>要使用 &lt;code>@st.cache&lt;/code> 裝飾器，就需要將運算部分的程式碼包成函式(def)。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="nd">@st.cache&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">suppress_st_warning&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">def&lt;/span> &lt;span class="nf">expensive_computation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s2">&amp;#34;沒有快取：expensive_computation({a})&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">slider&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;選擇一個數字&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">expensive_computation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;結果：&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/cache.png" alt="cache 快取" data-caption="cache 快取" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
cache 快取
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="網頁配置設定">網頁配置設定&lt;/h3>
&lt;p>要寫在程式內所有 Streamlit 命令之前，而且只能設定一次。&lt;/p>
&lt;p>此函式有四個參數：&lt;/p>
&lt;ul>
&lt;li>page_title：網頁標題，顯示在瀏覽器分頁的標籤上，預設是程式碼的檔名。&lt;/li>
&lt;li>page_icon：網頁圖標，顯示在網頁標題前，可以使用 &lt;code>st.image&lt;/code> 或 Emoji，或者使用&amp;quot;random&amp;quot;讓它隨機產生XD。&lt;/li>
&lt;li>layout：網頁中佈局寬度，預設是&amp;quot;centered&amp;quot;，還可以使用&amp;quot;wide&amp;quot;。&lt;/li>
&lt;li>initial_sidebar_state：側邊欄顯示狀態，&amp;quot;expanded&amp;quot;打開或&amp;quot;collapsed&amp;quot;隱藏，預設是&amp;quot;auto&amp;quot;，代表在手機尺寸的設備上是隱藏，否則是打開顯示。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/web_page.png" alt="網頁標題與 icon" data-caption="網頁標題與 icon" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
網頁標題與 icon
&lt;/figcaption>
&lt;/figure>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">st&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_page_config&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">page_title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;自定義網頁標題&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">page_icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;random&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">layout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;centered&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="n">initial_sidebar_state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;collapsed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="網頁選單設定">網頁選單設定&lt;/h3>
&lt;p>在網頁右上方有個選單，包含之前提過的 Rerun，以及清除快取、連結到官方文件論壇，甚至還有螢幕錄影功能，將你的操作流程直接錄影起來，展示給其他人。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/menu.jpg" alt="網頁選單" data-caption="網頁選單" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
網頁選單
&lt;/figcaption>
&lt;/figure>
&lt;p>而選單內的&amp;quot;設定&amp;quot;有幾個選項：&lt;/p>
&lt;ul>
&lt;li>Run on save：程式存檔後網頁自動重跑，不需要再手動點 Rerun&lt;/li>
&lt;li>Wide mode：佈局寬度調寬&lt;/li>
&lt;li>Theme：佈景主題&lt;/li>
&lt;/ul>
&lt;p>* 自定義主題可參考&lt;a href="https://blog.streamlit.io/introducing-theming/" target="_blank" rel="noopener">
官方介紹說明
&lt;/a>。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/streamlit/settings.jpg" alt="網頁設定" data-caption="網頁設定" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
網頁設定
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="部署應用程式">部署應用程式&lt;/h3>
&lt;p>官方提供一種方式部署，只需要將你的 Streamlit 應用程式放在 GitHub 上，即可登入 share.streamlit.io 去部署運行起來。&lt;/p>
&lt;p>完整部署介紹請參考&lt;a href="https://docs.streamlit.io/en/stable/deploy_streamlit_app.html" target="_blank" rel="noopener">
官方說明
&lt;/a>：&lt;/p>
&lt;ol>
&lt;li>先確認你的資料夾內有 &lt;a href="https://docs.streamlit.io/en/stable/deploy_streamlit_app.html#python-dependencies" target="_blank" rel="noopener">
Python 依賴文件
&lt;/a>，例如 &lt;code>requirements.txt&lt;/code>、&lt;code>Pipfile&lt;/code>、&lt;code>pyproject.toml&lt;/code>、&lt;code>environment.yml&lt;/code> 這幾種，或者還有 &lt;a href="https://docs.streamlit.io/en/stable/deploy_streamlit_app.html#apt-get-dependencies" target="_blank" rel="noopener">
apt-get 依賴
&lt;/a>。&lt;/li>
&lt;li>將你的 Streamlit 應用程式推到自己的 GitHub 公開 Repository。&lt;/li>
&lt;li>前往&lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
官網
&lt;/a>註冊登入，並到 &lt;a href="https://streamlit.io/sharing-sign-up" target="_blank" rel="noopener">
Get an invite to Streamlit sharing
&lt;/a> 設定。&lt;/li>
&lt;li>打開網址、查看結果~&lt;/li>
&lt;/ol>
&lt;p>註冊 Streamlit sharing 後要等到邀請的 Email 回信，我的經驗是等了一天。&lt;/p>
&lt;br/>
&lt;p>&lt;strong>應用程式網址格式&lt;/strong>&lt;/p>
&lt;p>你的網址格式為：&lt;br />
&lt;code>https://share.streamlit.io/[user name]/[repo name]/[branch name]/[app path]&lt;/code>&lt;br />
例如我上面的範例是：&lt;br />
&lt;code>https://share.streamlit.io/it-jia/streamlit_demo/master/streamlit_app.py&lt;/code>&lt;/p>
&lt;p>而如果你 Git 分支是 &lt;code>master&lt;/code>，或應用程式檔案名稱為 &lt;code>streamlit_app.py&lt;/code>，甚至可以簡化成：&lt;br />
&lt;code>https://share.streamlit.io/[user name]/[repo name]&lt;/code>&lt;br />
我的範例簡化成：&lt;br />
&lt;code>https://share.streamlit.io/it-jia/streamlit_demo&lt;/code>&lt;/p>
&lt;br/>
&lt;!--adsense-->
&lt;h2 id="完整範例程式碼">完整範例程式碼&lt;/h2>
&lt;p>附上完整範例程式碼：&lt;a href="https://github.com/it-jia/streamlit_demo/blob/master/streamlit_app.py" target="_blank" rel="noopener">
streamlit_app.py
&lt;/a>&lt;/p>
&lt;p>此範例程式碼部署在 share.streamlit.io 的 Demo：&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">Streamlit 成果範例：&lt;a href="https://share.streamlit.io/it-jia/streamlit_demo/streamlit_app.py">streamlit_demo&lt;/a>&lt;/div>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>實際安裝使用後，發現這個套件真的可以很容易、快速的建立一個顯示資料用的儀表板(Dashboard)，因此寫這篇文章來分享給大家~&lt;/p>
&lt;p>官方有將 API 濃縮成一頁，方便快速尋找：&lt;br />
&lt;a href="https://share.streamlit.io/daniellewisdl/streamlit-cheat-sheet/app.py">https://share.streamlit.io/daniellewisdl/streamlit-cheat-sheet/app.py&lt;/a>&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://streamlit.io/" target="_blank" rel="noopener">
Streamlit 官方網站
&lt;/a>&lt;br />
&lt;a href="https://docs.streamlit.io/en/stable/" target="_blank" rel="noopener">
Streamlit 官方文檔
&lt;/a>&lt;br />
&lt;a href="https://neutron0916.medium.com/c433e1da1559" target="_blank" rel="noopener">
Streamlit極簡易的Dashboard開發 - Neutron
&lt;/a>&lt;br />
&lt;a href="https://officeguide.cc/python-streamlit-build-web-data-analysis-app-tutorial-examples/" target="_blank" rel="noopener">
Python 以 Streamlit 建立網頁資料分析應用程式教學與範例 - Office指南
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>選擇，比努力更重要。&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/streamlit.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/streamlit_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Python</category><category>Streamlit</category><category>Dashboard</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>Python 使用 Faker 套件來生成假資料</title><link>https://blog.jiatool.com/posts/faker/</link><pubDate>Mon, 09 Nov 2020 21:00:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Mon, 09 Nov 2020 21:00:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/faker/</guid><description>前言 有時候可能因為某些原因需要生成一些假資料，例如做網頁時，先填入一些假資料方便排版。 在 Python 中就有一個 Faker 套件來產生假資料，包括人名、電話、地址</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>有時候可能因為某些原因需要生成一些假資料，例如做網頁時，先填入一些假資料方便排版。&lt;/p>
&lt;p>在 Python 中就有一個 Faker 套件來產生假資料，包括人名、電話、地址、工作、公司、信用卡、IP&amp;hellip;&amp;hellip;非常多樣。&lt;/p>
&lt;h2 id="安裝">安裝&lt;/h2>
&lt;p>安裝也很簡單，可以透過 pip 安裝：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install faker
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這邊要注意的是從版本 v4.0.0 開始，Faker 只支援 Python 3.5 及更新版本，並不支援 Python 2。&lt;/p>
&lt;p>以下以撰寫文章時最新的版本 v4.14.2 為範例。&lt;br />
&lt;a href="https://github.com/joke2k/faker" target="_blank" rel="noopener">
Faker 官方GitHub
&lt;/a>&lt;br />
&lt;a href="https://faker.readthedocs.io/en/master/" target="_blank" rel="noopener">
Faker 官方文件
&lt;/a>&lt;/p>
&lt;h2 id="簡易範例">簡易範例&lt;/h2>
&lt;p>使用 faker.Faker() 來創建並初始化產生器，調用方法來產生資料，例如以下名字、地址。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">from&lt;/span> &lt;span class="nn">faker&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Faker&lt;/span>
&lt;span class="n">fake&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Faker&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># Carla Parker&lt;/span>
&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">address&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 1882 Erika Glens\nRoblesbury, MO 28877&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="語言包">語言包&lt;/h2>
&lt;p>看到這裡，可能有人覺得都是生成英文數據，我想要繁體中文那怎麼辦🤔&lt;br />
別擔心，Faker 有內建語言包的機制，在一開始創建 Faker 時帶入語言參數即可。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">fake&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Faker&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;zh_TW&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">address&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;--------&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 許哲瑋&lt;/span>
&lt;span class="c1"># 45851 臺東市復興路11號之9&lt;/span>
&lt;span class="c1"># --------&lt;/span>
&lt;span class="c1"># 林雅慧&lt;/span>
&lt;span class="c1"># 67491 台北縣學府巷468號之1&lt;/span>
&lt;span class="c1"># --------&lt;/span>
&lt;span class="c1"># 陳宇軒&lt;/span>
&lt;span class="c1"># 20610 新竹民治巷862號之2&lt;/span>
&lt;span class="c1"># --------&lt;/span>
&lt;span class="c1"># 殷沖&lt;/span>
&lt;span class="c1"># 80604 橫山中興路5段595號5樓&lt;/span>
&lt;span class="c1"># --------&lt;/span>
&lt;span class="c1"># 李信宏&lt;/span>
&lt;span class="c1"># 51142 台北大同路172號之2&lt;/span>
&lt;span class="c1"># --------&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>你如果想要多個語言混合，當然也行🤣&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">fake&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Faker&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s1">&amp;#39;zh_TW&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;ja_JP&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;ko_KR&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 佐々木 明美&lt;/span>
&lt;span class="c1"># 高橋 直子&lt;/span>
&lt;span class="c1"># 宋惠如&lt;/span>
&lt;span class="c1"># 이영일&lt;/span>
&lt;span class="c1"># 佐々木 桃子&lt;/span>
&lt;span class="c1"># 김미영&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>一些常見的語言代碼如下：&lt;/p>
&lt;ul>
&lt;li>繁體中文：zh_TW&lt;/li>
&lt;li>簡體中文：zh_CN&lt;/li>
&lt;li>美國英文：en_US&lt;/li>
&lt;li>英國英文：en_GB&lt;/li>
&lt;li>日文：ja_JP&lt;/li>
&lt;li>韓文：ko_KR&lt;/li>
&lt;li>完整的語言包列表，請參考官方文件：&lt;a href="https://faker.readthedocs.io/en/master/locales.html" target="_blank" rel="noopener">
https://faker.readthedocs.io/en/master/locales.html
&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>* 題外話：我發現它的繁體中文有些地方不是很好，感覺是從簡體直接轉過來的。&lt;/p>
&lt;h2 id="方法介紹">方法介紹&lt;/h2>
&lt;h4 id="人名">人名&lt;/h4>
&lt;p>與人名相關數據，例如：姓氏、名字、羅馬拼音等等。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 袁家銘&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name_female&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 女生人名&lt;/span>
&lt;span class="c1"># 莫怡萱&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name_male&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 男生人名&lt;/span>
&lt;span class="c1"># 孫威廷&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">romanized_name&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 羅馬拼音&lt;/span>
&lt;span class="c1"># Ping Long&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">last_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 楊&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">last_name_female&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 李&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">last_name_male&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 黃&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">last_romanized_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Lin&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">first_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 家豪&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">first_name_female&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 惠雯&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">first_name_male&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 冠霖&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">first_romanized_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Jing&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="個人資料">個人資料&lt;/h4>
&lt;p>像是：語言、手機號碼、身分證、工作職稱。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">language_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Turkmen&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">country_calling_code&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># +290 8&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">phone_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 0977-739186&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ssn&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># D169226625&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">job&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 工業設計&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">simple_profile&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># {&amp;#39;username&amp;#39;: &amp;#39;sfang&amp;#39;, &amp;#39;name&amp;#39;: &amp;#39;李雅文&amp;#39;, &amp;#39;sex&amp;#39;: &amp;#39;M&amp;#39;, &amp;#39;address&amp;#39;: &amp;#39;42346 板橋縣民有路310號之3&amp;#39;, &amp;#39;mail&amp;#39;: &amp;#39;xiuyingxue@gmail.com&amp;#39;, &amp;#39;birthdate&amp;#39;: datetime.date(1936, 2, 13)}&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="地址">地址&lt;/h4>
&lt;p>與地址相關數據，例如：完整地址、城市、鄉鎮、路名&amp;hellip;&amp;hellip;。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">address&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 30751 基隆市仁愛街93號6樓&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">building_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 4號&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">city&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 卑南縣&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">city_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 草屯&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">city_name_suffix&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 縣&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">country&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 俄羅斯&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">country_code&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># LT&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">postcode&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 824&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">secondary_address&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 之2&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">street_address&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 自由街759號&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">street_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 信義&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">street_name_suffix&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 路&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="公司">公司&lt;/h4>
&lt;p>與公司相關數據，例如：公司名稱、公司前綴、公司後綴等等。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bs&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># synergize enterprise relationships&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">catch_phrase&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Object-based zero administration secured line&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">company&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 台北眾大捷運股份有限公司&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">company_prefix&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 品誠&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">company_suffix&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 有限公司&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="句子">句子&lt;/h4>
&lt;p>與句子、單詞相關數據。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sentence&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 發生服務選擇人民游戲然后一下法律.&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sentences&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># [&amp;#39;發現密碼地區那個精華制作.&amp;#39;, &amp;#39;擁有地方手機所有.&amp;#39;, &amp;#39;業務決定地址經濟投資方式.&amp;#39;]&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">max_nb_chars&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># 基本主要研究根據一種當然各種.&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">word&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 關於&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">words&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># [&amp;#39;一種&amp;#39;, &amp;#39;電影&amp;#39;, &amp;#39;大學&amp;#39;]&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="日期時間">日期時間&lt;/h4>
&lt;p>日期時間相關數據，譬如：日期、時間、星期&amp;hellip;&amp;hellip;。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">am_pm&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># AM&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iso8601&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 1988-07-01T02:40:03&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 1970-12-22&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date_object&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># datetime.date(2004, 3, 20)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date_this_month&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">before_today&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">after_today&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">False&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># 2020-11-07&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">day_of_month&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 01&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">day_of_week&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Saturday&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">month_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># April&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 02:46:38&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time_object&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># datetime.time(8, 43, 22)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">unix_time&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 1429693221&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="檔案">檔案&lt;/h4>
&lt;p>包括檔案名稱、附檔名、路徑等等。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">fake&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Faker&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">file_extension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;image&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># jpeg&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">file_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># central.png&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># /recently/pass.js&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">unix_device&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># /dev/sdg&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="網路">網路&lt;/h4>
&lt;p>與網路相關數據，例如：Email、HTTP方法、IP、網址、網域&amp;hellip;&amp;hellip;。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">company_email&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># dmeng@zou.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">domain_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># tang.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">domain_word&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># gao&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># slei@gmail.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">free_email&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># mliu@hotmail.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">free_email_domain&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># yahoo.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hostname&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># desktop-15.wan.com&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">http_method&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># POST&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">image_url&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># https://placeimg.com/431/555/any&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ipv4&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 28.144.124.103&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ipv4_network_class&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># c&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ipv4_private&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 192.168.96.99&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ipv4_public&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 75.81.186.65&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mac_address&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># d2:3c:7b:3b:93:4f&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">uri&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># http://fu.com/wp-content/categories/main/index/&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">uri_extension&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># .php&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">uri_page&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># search&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># http://qiao.com/&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">user_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># mingyan&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="顏色">顏色&lt;/h4>
&lt;p>生成顏色色碼，像是：HEX、RGB、HSV、HSL等等。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># #6626ef&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hue&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;red&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># #ed6595&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hue&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">color_format&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;rgb&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># rgb(36, 181, 79)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hue&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">135&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">luminosity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;dark&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">color_format&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;hsv&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># hsv(135, 95, 65)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">color_name&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># DarkMagenta&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex_color&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># #dd5cbb&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rgb_color&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 35,232,144&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="信用卡">信用卡&lt;/h4>
&lt;p>信用卡相關資訊。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">credit_card_full&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 信用卡詳細信息&lt;/span>
&lt;span class="c1"># JCB 16 digit&lt;/span>
&lt;span class="c1"># 鈺婷 柳&lt;/span>
&lt;span class="c1"># 3580134175667608 07/21&lt;/span>
&lt;span class="c1"># CVC: 070&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">credit_card_number&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 卡號&lt;/span>
&lt;span class="c1"># 377183544094989&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">credit_card_expire&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 有效日期&lt;/span>
&lt;span class="c1"># 02/27&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">credit_card_provider&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 提供商名稱&lt;/span>
&lt;span class="c1"># VISA 19 digit&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">credit_card_security_code&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 安全碼&lt;/span>
&lt;span class="c1"># 320&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="python-相關">Python 相關&lt;/h4>
&lt;p>與 Python 相關資料格式，可能對於測試很好用(?)，例如：Email、HTTP方法、IP、網址、網域&amp;hellip;&amp;hellip;。&lt;br />
(竟然還有這種東西😮)&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pybool&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># False&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pydecimal&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># -7867266828.6&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pydict&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># {&amp;#39;都是&amp;#39;: &amp;#39;MyXkRCJjYanEWNNuYrLM&amp;#39;, &amp;#39;一次&amp;#39;: &amp;#39;qiang69@gmail.com&amp;#39;, &amp;#39;政府&amp;#39;: Decimal(&amp;#39;2879320.4&amp;#39;), &amp;#39;工作&amp;#39;: &amp;#39;fDURUWoCzsGhHdvjJHXM&amp;#39;, &amp;#39;信息&amp;#39;: 1080, &amp;#39;功能&amp;#39;: &amp;#39;hNvGqVhrMVwOYiYpYghC&amp;#39;, &amp;#39;要求&amp;#39;: Decimal(&amp;#39;41.93441406219&amp;#39;), &amp;#39;一切&amp;#39;: &amp;#39;https://mao.tw/homepage/&amp;#39;, &amp;#39;開始&amp;#39;: 446798.631125}&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pylist&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># [&amp;#39;IartORkSBcHGqJCpfbMq&amp;#39;, &amp;#39;https://www.cui.com/terms.htm&amp;#39;, datetime.datetime(1995, 12, 12, 4, 32, 50), &amp;#39;vsJNgfvnxjDttefVvoIu&amp;#39;, &amp;#39;JxzLdZhLDYvgZHiHWjdO&amp;#39;, 6960, &amp;#39;mojun@hotmail.com&amp;#39;, &amp;#39;liangchao@yahoo.com&amp;#39;, datetime.datetime(2013, 5, 9, 12, 38, 18), &amp;#39;phao@hotmail.com&amp;#39;, &amp;#39;https://mo.com/privacy/&amp;#39;, 6105]&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="其他更多">其他更多&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random_digit&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 8&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random_digit_not_null&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># 3&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random_int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">min&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">max&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># 12&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random_element&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">elements&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;d&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;span class="c1"># d&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">numerify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Intel Core i&lt;/span>&lt;span class="si">%-%&lt;/span>&lt;span class="s1">%##K vs AMD Ryzen &lt;/span>&lt;span class="si">% %%##X&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># Intel Core i8-9363K vs AMD Ryzen 4 6134X&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">language_code&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># i18n 語言碼&lt;/span>
&lt;span class="c1"># uk&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">license_plate&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 車牌&lt;/span>
&lt;span class="c1"># 048-DQU&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isbn10&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># ISBN碼&lt;/span>
&lt;span class="c1"># 1-57202-578-6&lt;/span>
&lt;span class="c1"># user agent&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">android_platform_token&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Android 4.1.1&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ios_platform_token&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># iPhone; CPU iPhone OS 10_3_3 like Mac OS X&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chrome&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.0 (KHTML, like Gecko) Chrome/38.0.819.0 Safari/535.0&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fake&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">user_agent&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="c1"># Mozilla/5.0 (Windows 98; ug-CN; rv:1.9.1.20) Gecko/2016-01-13 09:28:45 Firefox/13.0&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>真的是太多了，這邊不一一列出，&lt;br />
更詳細參數介紹及其他方法請參閱 Faker 官方文件：&lt;a href="https://faker.readthedocs.io/en/master/providers.html" target="_blank" rel="noopener">
Standard Providers
&lt;/a>&lt;/p>
&lt;p>還有其他人提供並經過官方認可的，例如&amp;quot;汽車&amp;quot;、&amp;quot;Wi-Fi ESSID&amp;quot;、&amp;quot;Web相關&amp;quot;之類的類別：&lt;a href="https://faker.readthedocs.io/en/master/communityproviders.html" target="_blank" rel="noopener">
Community Providers
&lt;/a>&lt;/p>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>有沒有覺得 Faker 套件所包含的假資料包羅萬象啊🤣，趕快將此網頁加入&amp;quot;我的最愛(書籤)&amp;quot;，搞不好以後就有機會使用到呢~&lt;/p>
&lt;br/>
&lt;br/>
&lt;p>如有遇到其他問題，或文章內容有誤，歡迎底下留言~😙&lt;/p>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://github.com/joke2k/faker" target="_blank" rel="noopener">
Faker 官方GitHub
&lt;/a>&lt;br />
&lt;a href="https://faker.readthedocs.io/en/master/" target="_blank" rel="noopener">
Faker 官方文件
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>You've got to find what you love.&lt;br />
你必須找到你所愛的。&lt;/p>
&lt;p align="right">—— 賈伯斯(Steve Jobs)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/faker.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><category>Python</category><category>套件</category><category>分享</category><category>Python套件</category></item><item><title>Python 使用 Arrow 套件來處理日期時間</title><link>https://blog.jiatool.com/posts/arrow/</link><pubDate>Sun, 26 Jul 2020 13:35:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sun, 26 Jul 2020 13:35:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/arrow/</guid><description>前言 在寫網路爬蟲時，應該都會遇到需要解析日期時間的處理，但是Python內建有關日期時間的套件用久了覺得有點卡手，像是有以下缺點： 太多套件(</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>在寫網路爬蟲時，應該都會遇到需要解析日期時間的處理，但是Python內建有關日期時間的套件用久了覺得有點卡手，像是有以下缺點：&lt;/p>
&lt;ul>
&lt;li>太多套件(time、datetime、calendar、dateutil、pytz等)。&lt;/li>
&lt;li>有時需要在不同格式之間轉換，不是這麼的方便或繁瑣，例如時間格式、字串、時間戳、localtime和utctime、時區。&lt;/li>
&lt;li>在某些方面較不直觀或難記，像是格式化字串的參數。&lt;/li>
&lt;/ul>
&lt;br/>
&lt;p>在某天碰巧在網路的論壇中發現有人推薦 Arrow，看了一下，好像蠻不錯用的。&lt;/p>
&lt;p>例如我們想把某日期時間字串加上5小時，再轉回字串的話，使用內建的&lt;strong>datetime&lt;/strong>與&lt;strong>Arrow&lt;/strong>來比較：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 使用內建的datetime&lt;/span>
&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timedelta&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strptime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2020-07-25 10:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2"> %H:%M&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2"> %H:%M&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25 15:00&lt;/span>
&lt;span class="c1"># 使用Arrow&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">arrow&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2020-07-25 10:00&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25 15:00&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="安裝">安裝&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install arrow
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>以下以撰寫文章時最新的版本 v0.15.7 為範例。&lt;br />
&lt;a href="https://github.com/crsmithdev/arrow" target="_blank" rel="noopener">
Arrow 官方GitHub
&lt;/a>&lt;br />
&lt;a href="https://arrow.readthedocs.io/" target="_blank" rel="noopener">
Arrow 官方文件
&lt;/a>&lt;/p>
&lt;h2 id="功能範例">功能範例&lt;/h2>
&lt;h4 id="創建時間">創建時間&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 當前時間&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 2020-07-25T22:12:08.803133+08:00&lt;/span>
&lt;span class="c1"># 當前UTC時間&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">utcnow&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 2020-07-25T14:12:08.803133+00:00&lt;/span>
&lt;span class="c1"># 自訂時間&lt;/span>
&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T21:50:45+00:00&lt;/span>
&lt;span class="c1"># 取得其中的數值&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">year&lt;/span>
&lt;span class="c1"># 2020&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hour&lt;/span>
&lt;span class="c1"># 21&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timestamp&lt;/span> &lt;span class="c1"># 時間戳&lt;/span>
&lt;span class="c1"># 1594504245&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="格式化成字串-format">格式化成字串 [format]&lt;/h4>
&lt;p>&lt;a href="#%e8%a7%a3%e6%9e%90%e5%92%8c%e6%a0%bc%e5%bc%8f%e5%8c%96-%e5%8f%83%e6%95%b8" target="_blank" rel="noopener">
格式化參數
&lt;/a>放置於文章最後。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY/MM/DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020/07/25 21:50:45&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;MMM DD dddd&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># Jul 25 Saturday&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="轉換為-datetime-函數中的-datetimedatetime">轉換為 datetime 函數中的 [datetime、date、time]&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># &amp;lt;class &amp;#39;arrow.arrow.Arrow&amp;#39;&amp;gt; 2020-07-25T21:50:45+00:00&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">datetime&lt;/span>
&lt;span class="c1"># &amp;lt;class &amp;#39;datetime.datetime&amp;#39;&amp;gt; 2020-07-25 21:50:45+00:00&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># &amp;lt;class &amp;#39;datetime.date&amp;#39;&amp;gt; 2020-07-25&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># &amp;lt;class &amp;#39;datetime.time&amp;#39;&amp;gt; 21:50:45&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="移動時間-shift">移動時間 [shift]&lt;/h4>
&lt;p>參數有 years, months, days, hours, minutes, seconds, microseconds, weeks, quarters, weekday。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 3天前&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=-&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-22T21:50:45+00:00&lt;/span>
&lt;span class="c1"># 50天又2小時後&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-09-13T23:50:45+00:00&lt;/span>
&lt;span class="c1"># 上星期&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">weeks&lt;/span>&lt;span class="o">=-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-18T21:50:45+00:00&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="修改日期-replace">修改日期 [replace]&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">year&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2025&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">month&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">day&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2025-12-31T21:50:45+00:00&lt;/span>
&lt;span class="c1"># 替換時區&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tzinfo&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Asia/Taipei&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T21:50:45+08:00&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="轉換時區-to">轉換時區 [to]&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mo">00&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mo">00&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T20:00:00+00:00&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Asia/Taipei&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-26T04:00:00+08:00&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;local&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-26T04:00:00+08:00&lt;/span>
&lt;span class="n">t&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utc&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T20:00:00+00:00&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="從不同的格式轉換為arrow格式-get">從不同的格式轉換為Arrow格式 [get]&lt;/h4>
&lt;p>他還可以自動判斷！&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;2020/10/09 16:15:14&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-10-09T16:15:14+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;2020-07-30T01:26:43.8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-30T01:26:43.800000+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># 2020-07-25T10:10:30+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="c1"># 2020-07-25T00:00:00+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T12:30:45+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2020-07-25 11:30&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;YYYY-MM-DD HH:mm&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T11:30:00+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1595651445&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T04:30:45+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;1595651445&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;X&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T04:30:45+00:00&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="產生一段範圍-range-span">產生一段範圍 [range span]&lt;/h4>
&lt;p>range：時間範圍內依某級別(hour)產生時間點&lt;br />
span：初始與結尾時間點&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2020&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">for&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hour&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2020-07-25T11:50:00+00:00&lt;/span>
&lt;span class="c1"># 2020-07-25T12:50:00+00:00&lt;/span>
&lt;span class="c1"># 2020-07-25T13:50:00+00:00&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">span&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hour&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># (&amp;lt;Arrow [2020-07-25T11:00:00+08:00]&amp;gt;, &amp;lt;Arrow [2020-07-25T11:59:59.999999+08:00]&amp;gt;)&lt;/span>
&lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">span&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hour&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># (&amp;lt;Arrow [2020-07-25T11:00:00+08:00]&amp;gt;, &amp;lt;Arrow [2020-07-25T12:59:59.999999+08:00]&amp;gt;)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="人性化敘述方式呈現-humanize">人性化(敘述)方式呈現 [humanize]&lt;/h4>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">arw&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">arw&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># in an hour&lt;/span>
&lt;span class="n">arw&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hours&lt;/span>&lt;span class="o">=-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">arw&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 2 hours ago&lt;/span>
&lt;span class="c1"># 也可以用中文顯示哦！！&lt;/span>
&lt;span class="c1"># https://github.com/crsmithdev/arrow/blob/master/arrow/locales.py&lt;/span>
&lt;span class="n">arw&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">locale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zh_tw&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2小時前&lt;/span>
&lt;span class="c1"># 指定要顯示的級別&lt;/span>
&lt;span class="n">arw&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">utcnow&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">seconds&lt;/span>&lt;span class="o">=+&lt;/span>&lt;span class="mi">8400&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">arw&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">granularity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;minute&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">locale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zh_tw&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 140分鐘後&lt;/span>
&lt;span class="n">arw&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">granularity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;hour&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;minute&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">locale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zh_tw&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 2小時 和 20分鐘後&lt;/span>
&lt;span class="c1"># 也可以拿兩個時間來比對&lt;/span>
&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrow&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shift&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">weeks&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">humanize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">locale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zh_tw&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 1週前&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="解析和格式化-參數">解析和格式化 參數&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>說明&lt;/th>
&lt;th>語法&lt;/th>
&lt;th>結果&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Year 年&lt;/td>
&lt;td>YYYY&lt;/td>
&lt;td>2000, 2001, 2002 &amp;hellip; 2012, 2013&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>YY&lt;/td>
&lt;td>00, 01, 02 &amp;hellip; 12, 13&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Month 月&lt;/td>
&lt;td>MMMM&lt;/td>
&lt;td>January, February, March &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>MMM&lt;/td>
&lt;td>Jan, Feb, Mar &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>MM&lt;/td>
&lt;td>01, 02, 03 &amp;hellip; 11, 12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>M&lt;/td>
&lt;td>1, 2, 3 &amp;hellip; 11, 12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day of Year 一年中的天數&lt;/td>
&lt;td>DDDD&lt;/td>
&lt;td>001, 002, 003 &amp;hellip; 364, 365&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>DDD&lt;/td>
&lt;td>1, 2, 3 … 364, 365&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day of Month 一個月中的天數&lt;/td>
&lt;td>DD&lt;/td>
&lt;td>01, 02, 03 &amp;hellip; 30, 31&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>D&lt;/td>
&lt;td>1, 2, 3 &amp;hellip; 30, 31&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>Do&lt;/td>
&lt;td>1st, 2nd, 3rd &amp;hellip; 30th, 31st&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Day of Week 一週中的天數&lt;/td>
&lt;td>dddd&lt;/td>
&lt;td>Monday, Tuesday, Wednesday &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>ddd&lt;/td>
&lt;td>Mon, Tue, Wed &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>d&lt;/td>
&lt;td>1, 2, 3 &amp;hellip; 6, 7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hour 小時&lt;/td>
&lt;td>HH&lt;/td>
&lt;td>00, 01, 02 &amp;hellip; 23, 24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>H&lt;/td>
&lt;td>0, 1, 2 &amp;hellip; 23, 24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>hh&lt;/td>
&lt;td>01, 02, 03 &amp;hellip; 11, 12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>h&lt;/td>
&lt;td>1, 2, 3 &amp;hellip; 11, 12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AM / PM&lt;/td>
&lt;td>A&lt;/td>
&lt;td>AM, PM, am, pm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>a&lt;/td>
&lt;td>am, pm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Minute 分鐘&lt;/td>
&lt;td>mm&lt;/td>
&lt;td>00, 01, 02 &amp;hellip; 58, 59&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>m&lt;/td>
&lt;td>0, 1, 2 &amp;hellip; 58, 59&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Second 秒&lt;/td>
&lt;td>ss&lt;/td>
&lt;td>00, 01, 02 &amp;hellip; 58, 59&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>s&lt;/td>
&lt;td>0, 1, 2 &amp;hellip; 58, 59&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sub-second&lt;/td>
&lt;td>S&lt;/td>
&lt;td>0, 02, 003, 000006, 123123123123&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Timezone 時區&lt;/td>
&lt;td>ZZZ&lt;/td>
&lt;td>Asia/Taipei, Europe/Warsaw, GMT &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>ZZ&lt;/td>
&lt;td>-08:00, -07:00 &amp;hellip; +07:00, +08:00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>Z&lt;/td>
&lt;td>-0800, -0700 &amp;hellip; +0700, +0800&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Seconds Timestamp 時間戳&lt;/td>
&lt;td>X&lt;/td>
&lt;td>1381685817, 1381685817.915482&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ms or µs Timestamp 時間戳&lt;/td>
&lt;td>x&lt;/td>
&lt;td>1569980330813, 1569980330813221&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>其他更進階的語法可以前往&lt;a href="https://arrow.readthedocs.io/" target="_blank" rel="noopener">
Arrow 官方文件
&lt;/a>查閱~&lt;/p>
&lt;p>相比Python內建的日期時間套件，用起來應該清楚、好用吧。&lt;br />
只是缺點是使用前要先安裝。&lt;/p>
&lt;br/>
&lt;br/>
&lt;br/>
&lt;p>如有遇到其他問題，或文章內容有誤，歡迎底下留言~😙&lt;/p>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://github.com/crsmithdev/arrow" target="_blank" rel="noopener">
Arrow 官方GitHub
&lt;/a>&lt;br />
&lt;a href="https://arrow.readthedocs.io/" target="_blank" rel="noopener">
Arrow 官方文件
&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>當你認為全世界都在跟你做對時，&lt;br />
請記得 飛機是逆風而飛的。&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/arrow.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><category>Python</category><category>套件</category><category>分享</category><category>Python套件</category></item></channel></rss>