1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用 Python 的 Template 類生成文件報(bào)告

        共 3861字,需瀏覽 8分鐘

         ·

        2021-01-15 18:37

        介紹
        很多時(shí)候,我發(fā)現(xiàn)自己需要進(jìn)行生成報(bào)告、輸出文件或字符串的任務(wù)。它們或多或少都會(huì)遵循某種模式,通常這些模式是如此相似,以至于我們希望擁有一個(gè)可以重用并直接輸入數(shù)據(jù)的模板。幸運(yùn)的是,Python提供了一個(gè)可以幫助我們的類:string.Template
        在本文中,您將學(xué)習(xí)如何利用此類根據(jù)當(dāng)前使用的數(shù)據(jù)生成輸出文件,以及如何以相同的方式操作字符串。因此,本文不僅使用您在日常工作中可能遇到的示例,還為您提供了許多您可能知道的實(shí)際工具,并且該工具將此類用于生成報(bào)告文件。下面讓我們開(kāi)始吧!
        注意:本文基于Python 3.9.0(CPython)。您可以在GitHub(https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class)上找到整篇文章中使用的代碼示例。
        在看一個(gè)示例之前,讓我們花一些時(shí)間來(lái)看看使用string.Template相對(duì)于其他解決方案的優(yōu)勢(shì)。
        1、無(wú)需其他依賴項(xiàng),開(kāi)箱即用,因此不需要使用pip install命令安裝。
        2、它是輕量級(jí)的,當(dāng)然諸如Jinja2Mako之類的模板引擎已被廣泛使用。但是,在本文介紹的方案中,這些功能是過(guò)分地夸大了。
        3、關(guān)注點(diǎn)分離:可以使用模板文件將其移動(dòng)到外部位置,而不是直接在代碼中嵌入字符串操作和報(bào)告生成。如果您要更改報(bào)告的結(jié)構(gòu)或設(shè)計(jì),則可以交換模板文件,而無(wú)需更改代碼。
        由于這些優(yōu)點(diǎn),一些知名的第三方庫(kù)和工具正在使用它。Wily是一個(gè)例子,在2018年底,Wily的發(fā)明者和維護(hù)者Anthony Shaw希望支持HTML作為wily生成的報(bào)告的輸出格式。
        示例:生成最佳圖書(shū)的報(bào)告
        在討論了使用Python的內(nèi)置string.Template類背后的動(dòng)機(jī)之后,我們將看一下第一個(gè)實(shí)際示例。想象一下,您正在一家公司工作,該公司發(fā)布有關(guān)過(guò)去一年出版的最佳書(shū)籍的年度報(bào)告。2020年是特殊的一年,因?yàn)槌四哪甓葓?bào)告之外,您還會(huì)發(fā)布有史以來(lái)最好的書(shū)籍清單。
        在這一點(diǎn)上,我們不在乎數(shù)據(jù)來(lái)自何處或哪些書(shū)籍是該列表的一部分。為了簡(jiǎn)單起見(jiàn),我們假設(shè)有一個(gè)名為data.json的JSON文件,其中包含作者姓名和書(shū)名的映射,如下所示。
        {
        ????"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ù)是以一種可以與他人共享的方式(例如, 大型雜志、公司或博主)。該公司認(rèn)為使用HTML格式的簡(jiǎn)單表格就足夠了?,F(xiàn)在的問(wèn)題是:如何生成此HTML表格?
        當(dāng)然,您可以手動(dòng)執(zhí)行此操作,也可以為每本書(shū)創(chuàng)建占位符。但是后面如果能擁有更通用的版本是非??扇〉模?yàn)榭梢詳U(kuò)展列表內(nèi)容或更改結(jié)構(gòu)設(shè)計(jì)。
        現(xiàn)在我們可以利用Python的string.Template類!我們首先創(chuàng)建實(shí)際的模板,如下所示。在這里,我們將文件稱為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>
        該文件本身非常初級(jí)。我們使用引導(dǎo)程序進(jìn)行樣式設(shè)置,并創(chuàng)建了最終表的基本結(jié)構(gòu)。表頭已包含在內(nèi),但數(shù)據(jù)仍然丟失。請(qǐng)注意,在tbody元素中,使用了一個(gè)占位符$ {elements}來(lái)標(biāo)記我們稍后將注入書(shū)籍列表的位置。
        我們把所有都已設(shè)置為實(shí)現(xiàn)生成所需輸出的Python腳本!因此,我們?cè)诋?dāng)前工作目錄中創(chuàng)建一個(gè)名為report.py的新Python文件。首先,我們導(dǎo)入所需的兩個(gè)內(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變量是一個(gè)字典,其中包含作者的名稱(鍵)和書(shū)名(值)作為鍵值對(duì)。接下來(lái),我們生成HTML表,將其放入模板中(還記得占位符嗎?)。因此,我們初始化一個(gè)空字符串,向其添加新的表行,如下所示。
        content?=?""
        for?i,?(author,?title)?in?enumerate(data.items()):
        ????content?+=?""
        ????content?+=?f"{i?+?1}"
        ????content?+=?f"{author}"
        ????content?+=?f"{title}"
        ????content?+=?""
        該代碼段顯示了我們遍歷數(shù)據(jù)字典中的所有項(xiàng)目,并將書(shū)名以及作者的名字放在相應(yīng)的HTML標(biāo)簽中。我們創(chuàng)建了最終的HTML表。在下一步中,我們需要加載之前創(chuàng)建的模板文件:
        with?open("template.html")?as?t:
        ????template?=?string.Template(t.read())
        注意,string.Template接受一個(gè)字符串,而不是一個(gè)文件路徑。因此,您還可以提供在程序中先前創(chuàng)建的字符串,而無(wú)需將其保存到文件中。就我們而言,我們提供了template.html文件的內(nèi)容。
        最后,我們使用模板的replace()方法將占位符元素替換為存儲(chǔ)在變量?jī)?nèi)容中的字符串。該方法返回一個(gè)字符串,我們將其存儲(chǔ)在變量final_output中。最后但并非最不重要的一點(diǎn)是,我們創(chuàng)建了一個(gè)名為report.html的新文件,并將最終輸出寫(xiě)入該文件。
        final_output?=?template.substitute(elements=content)
        with?open("report.html",?"w")?as?output:
        ????output.write(final_output)
        現(xiàn)在已經(jīng)生成了第一個(gè)文件報(bào)告!如果在瀏覽器中打開(kāi)report.html文件,則可以看到結(jié)果。
        safe_substitution()方法
        現(xiàn)在,您已經(jīng)構(gòu)建了第一個(gè)string.Template用例,在結(jié)束本文之前,我想與您分享一個(gè)常見(jiàn)情況及其解決方案:安全替換。它是什么?
        讓我們舉個(gè)例子:您有一個(gè)字符串,您想在其中輸入一個(gè)人的名字和姓氏。您可以按照以下步驟進(jìn)行操作:
        #?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)
        但是,如果您錯(cuò)過(guò)傳遞一個(gè)或另一個(gè)的值會(huì)怎樣?它引發(fā)一個(gè)KeyError。為避免這種情況,我們可以利用safe_substitution()方法。在這種情況下,safe意味著Python在任何情況下都嘗試返回有效字符串。因此,如果找不到任何值,則不會(huì)替換占位符。
        讓我們按以下方式調(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}
        在某些情況下,這可能是一個(gè)更優(yōu)雅的解決方案,甚至是必須的行為。但是這可能在其他地方引起意外的副作用。
        本文概要
        在閱讀本文時(shí),您不僅學(xué)習(xí)了Python字符串的基本知識(shí)。Template類以及使用它的原因,而且還實(shí)現(xiàn)了第一個(gè)文件報(bào)告腳本!此外,您已經(jīng)了解了safe_substitution()方法以及在哪種情況下使用它可能會(huì)有所幫助。

        更多閱讀



        2020 年最佳流行 Python 庫(kù) Top 10


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


        Top 10 沙雕又有趣的 GitHub 程序

        特別推薦




        點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

        瀏覽 64
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91综合久久| 国产Av婬乱麻豆| 欧洲操逼视频| 国产TS在线| 日韩理论在线| 亚洲中文免费观看| 熟女视频一区二区| 亚洲AV官方网站| 特级毛片WWW| 色色色色五月天|