<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 的 Template 類生成文件報告

          共 3861字,需瀏覽 8分鐘

           ·

          2021-01-15 18:37

          介紹
          很多時候,我發(fā)現(xiàn)自己需要進行生成報告、輸出文件或字符串的任務(wù)。它們或多或少都會遵循某種模式,通常這些模式是如此相似,以至于我們希望擁有一個可以重用并直接輸入數(shù)據(jù)的模板。幸運的是,Python提供了一個可以幫助我們的類:string.Template
          在本文中,您將學(xué)習(xí)如何利用此類根據(jù)當(dāng)前使用的數(shù)據(jù)生成輸出文件,以及如何以相同的方式操作字符串。因此,本文不僅使用您在日常工作中可能遇到的示例,還為您提供了許多您可能知道的實際工具,并且該工具將此類用于生成報告文件。下面讓我們開始吧!
          注意:本文基于Python 3.9.0(CPython)。您可以在GitHub(https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class)上找到整篇文章中使用的代碼示例。
          在看一個示例之前,讓我們花一些時間來看看使用string.Template相對于其他解決方案的優(yōu)勢。
          1、無需其他依賴項,開箱即用,因此不需要使用pip install命令安裝。
          2、它是輕量級的,當(dāng)然諸如Jinja2Mako之類的模板引擎已被廣泛使用。但是,在本文介紹的方案中,這些功能是過分地夸大了。
          3、關(guān)注點分離:可以使用模板文件將其移動到外部位置,而不是直接在代碼中嵌入字符串操作和報告生成。如果您要更改報告的結(jié)構(gòu)或設(shè)計,則可以交換模板文件,而無需更改代碼。
          由于這些優(yōu)點,一些知名的第三方庫和工具正在使用它。Wily是一個例子,在2018年底,Wily的發(fā)明者和維護者Anthony Shaw希望支持HTML作為wily生成的報告的輸出格式。
          示例:生成最佳圖書的報告
          在討論了使用Python的內(nèi)置string.Template類背后的動機之后,我們將看一下第一個實際示例。想象一下,您正在一家公司工作,該公司發(fā)布有關(guān)過去一年出版的最佳書籍的年度報告。2020年是特殊的一年,因為除了您的年度報告之外,您還會發(fā)布有史以來最好的書籍清單。
          在這一點上,我們不在乎數(shù)據(jù)來自何處或哪些書籍是該列表的一部分。為了簡單起見,我們假設(shè)有一個名為data.json的JSON文件,其中包含作者姓名和書名的映射,如下所示。
          {
          ????"Dale?Carnegie":?"How?To?Win?Friends?And?Influence?People",
          ????"Daniel?Kahneman":?"Thinking,?Fast?and?Slow",
          ????"Leo?Tolstoy":?"Anna?Karenina",
          ????"William?Shakespeare":?"Hamlet",
          ????"Franz?Kafka":?"The?Trial"
          }
          您現(xiàn)在的任務(wù)是以一種可以與他人共享的方式(例如, 大型雜志、公司或博主)。該公司認為使用HTML格式的簡單表格就足夠了。現(xiàn)在的問題是:如何生成此HTML表格?
          當(dāng)然,您可以手動執(zhí)行此操作,也可以為每本書創(chuàng)建占位符。但是后面如果能擁有更通用的版本是非常可取的,因為可以擴展列表內(nèi)容或更改結(jié)構(gòu)設(shè)計。
          現(xiàn)在我們可以利用Python的string.Template類!我們首先創(chuàng)建實際的模板,如下所示。在這里,我們將文件稱為template.html
          html>
          <html?lang="en">
          <head>
          ????<meta?charset="utf-8">
          ????<meta?name="viewport"?content="width=device-width,?initial-scale=1">

          ????<title>Great?Books?of?All?Timetitle>
          ????<link?rel="stylesheet"?href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"?integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2"?crossorigin="anonymous">
          head>
          <body>
          ????<div?class="container">
          ????????<h1>Great?Books?of?All?Timeh1>
          ????????<table?class="table">
          ????????????<thead>
          ????????????????<tr>
          ????????????????????<th?scope="col">#th>
          ????????????????????<th?scope="col">Authorth>
          ????????????????????<th?scope="col">Book?Titleth>
          ????????????????tr>
          ????????????thead>
          ????????????<tbody>
          ????????????????${elements}
          ????????????tbody>
          ????????table>
          ????div>
          body>
          html>
          該文件本身非常初級。我們使用引導(dǎo)程序進行樣式設(shè)置,并創(chuàng)建了最終表的基本結(jié)構(gòu)。表頭已包含在內(nèi),但數(shù)據(jù)仍然丟失。請注意,在tbody元素中,使用了一個占位符$ {elements}來標記我們稍后將注入書籍列表的位置。
          我們把所有都已設(shè)置為實現(xiàn)生成所需輸出的Python腳本!因此,我們在當(dāng)前工作目錄中創(chuàng)建一個名為report.py的新Python文件。首先,我們導(dǎo)入所需的兩個內(nèi)置模塊,并從JSON文件加載數(shù)據(jù)。
          #?report.py
          import?json
          import?string

          with?open("data.json")?as?f:
          ????data?=?json.loads(f.read())
          現(xiàn)在,data變量是一個字典,其中包含作者的名稱(鍵)和書名(值)作為鍵值對。接下來,我們生成HTML表,將其放入模板中(還記得占位符嗎?)。因此,我們初始化一個空字符串,向其添加新的表行,如下所示。
          content?=?""
          for?i,?(author,?title)?in?enumerate(data.items()):
          ????content?+=?""
          ????content?+=?f"{i?+?1}"
          ????content?+=?f"{author}"
          ????content?+=?f"{title}"
          ????content?+=?""
          該代碼段顯示了我們遍歷數(shù)據(jù)字典中的所有項目,并將書名以及作者的名字放在相應(yīng)的HTML標簽中。我們創(chuàng)建了最終的HTML表。在下一步中,我們需要加載之前創(chuàng)建的模板文件:
          with?open("template.html")?as?t:
          ????template?=?string.Template(t.read())
          注意,string.Template接受一個字符串,而不是一個文件路徑。因此,您還可以提供在程序中先前創(chuàng)建的字符串,而無需將其保存到文件中。就我們而言,我們提供了template.html文件的內(nèi)容。
          最后,我們使用模板的replace()方法將占位符元素替換為存儲在變量內(nèi)容中的字符串。該方法返回一個字符串,我們將其存儲在變量final_output中。最后但并非最不重要的一點是,我們創(chuàng)建了一個名為report.html的新文件,并將最終輸出寫入該文件。
          final_output?=?template.substitute(elements=content)
          with?open("report.html",?"w")?as?output:
          ????output.write(final_output)
          現(xiàn)在已經(jīng)生成了第一個文件報告!如果在瀏覽器中打開report.html文件,則可以看到結(jié)果。
          safe_substitution()方法
          現(xiàn)在,您已經(jīng)構(gòu)建了第一個string.Template用例,在結(jié)束本文之前,我想與您分享一個常見情況及其解決方案:安全替換。它是什么?
          讓我們舉個例子:您有一個字符串,您想在其中輸入一個人的名字和姓氏。您可以按照以下步驟進行操作:
          #?safe_substitution.py
          import?string

          template_string?=?"Your?name?is?${firstname}?${lastname}"
          t?=?string.Template(template_string)
          result?=?t.substitute(firstname="Florian",?lastname="Dahlitz")
          print(result)
          但是,如果您錯過傳遞一個或另一個的值會怎樣?它引發(fā)一個KeyError。為避免這種情況,我們可以利用safe_substitution()方法。在這種情況下,safe意味著Python在任何情況下都嘗試返回有效字符串。因此,如果找不到任何值,則不會替換占位符。
          讓我們按以下方式調(diào)整代碼:
          #?safe_substitution.py
          import?string

          template_string?=?"Your?name?is?${firstname}?${lastname}"
          t?=?string.Template(template_string)
          result?=?t.safe_substitute(firstname="Florian")
          print(result)??#?Your?name?is?Florian?${lastname}
          在某些情況下,這可能是一個更優(yōu)雅的解決方案,甚至是必須的行為。但是這可能在其他地方引起意外的副作用。
          本文概要
          在閱讀本文時,您不僅學(xué)習(xí)了Python字符串的基本知識。Template類以及使用它的原因,而且還實現(xiàn)了第一個文件報告腳本!此外,您已經(jīng)了解了safe_substitution()方法以及在哪種情況下使用它可能會有所幫助。

          更多閱讀



          2020 年最佳流行 Python 庫 Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          Top 10 沙雕又有趣的 GitHub 程序

          特別推薦




          點擊下方閱讀原文加入社區(qū)會員

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美少妇在线 | 色小伙操逼网 | 亚洲AV无码成人专区 | 一本一道久久 | 免费色情在线观看 |