用 Python 的 Template 类生成文件报告

介绍
很多时候,我发现自己需要进行生成报告、输出文件或字符串的任务。它们或多或少都会遵循某种模式,通常这些模式是如此相似,以至于我们希望拥有一个可以重用并直接输入数据的模板。幸运的是,Python提供了一个可以帮助我们的类:string.Template
在本文中,您将学习如何利用此类根据当前使用的数据生成输出文件,以及如何以相同的方式操作字符串。因此,本文不仅使用您在日常工作中可能遇到的示例,还为您提供了许多您可能知道的实际工具,并且该工具将此类用于生成报告文件。下面让我们开始吧!
注意:本文基于Python 3.9.0(CPython)。您可以在GitHub(https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class)上找到整篇文章中使用的代码示例。
在看一个示例之前,让我们花一些时间来看看使用string.Template相对于其他解决方案的优势。
1、无需其他依赖项,开箱即用,因此不需要使用pip install命令安装。
2、它是轻量级的,当然诸如Jinja2Mako之类的模板引擎已被广泛使用。但是,在本文介绍的方案中,这些功能是过分地夸大了。
3、关注点分离:可以使用模板文件将其移动到外部位置,而不是直接在代码中嵌入字符串操作和报告生成。如果您要更改报告的结构或设计,则可以交换模板文件,而无需更改代码。
由于这些优点,一些知名的第三方库和工具正在使用它。Wily是一个例子,在2018年底,Wily的发明者和维护者Anthony Shaw希望支持HTML作为wily生成的报告的输出格式。
示例:生成最佳图书的报告
在讨论了使用Python的内置string.Template类背后的动机之后,我们将看一下第一个实际示例。想象一下,您正在一家公司工作,该公司发布有关过去一年出版的最佳书籍的年度报告。2020年是特殊的一年,因为除了您的年度报告之外,您还会发布有史以来最好的书籍清单。
在这一点上,我们不在乎数据来自何处或哪些书籍是该列表的一部分。为了简单起见,我们假设有一个名为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'
}
您现在的任务是以一种可以与他人共享的方式(例如, 大型杂志、公司或博主)。该公司认为使用HTML格式的简单表格就足够了。现在的问题是:如何生成此HTML表格?
当然,您可以手动执行此操作,也可以为每本书创建占位符。但是后面如果能拥有更通用的版本是非常可取的,因为可以扩展列表内容或更改结构设计。
现在我们可以利用Python的string.Template类!我们首先创建实际的模板,如下所示。在这里,我们将文件称为template.html
<!DOCTYPE html><html lang='en'><head>    <meta charset='utf-8'>    <meta name='viewport' content='width=device-width, initial-scale=1'>

    <title>Great Books of All Time</title>    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css' integrity='sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2' crossorigin='anonymous'></head><body>    <div class='container'>        <h1>Great Books of All Time</h1>        <table class='table'>            <thead>                <tr>                    <th scope='col'>#</th>                    <th scope='col'>Author</th>                    <th scope='col'>Book Title</th>                </tr>            </thead>            <tbody>                ${elements}            </tbody>        </table>    </div></body></html>
该文件本身非常初级。我们使用引导程序进行样式设置,并创建了最终表的基本结构。表头已包含在内,但数据仍然丢失。请注意,在tbody元素中,使用了一个占位符$ {elements}来标记我们稍后将注入书籍列表的位置。
我们把所有都已设置为实现生成所需输出的Python脚本!因此,我们在当前工作目录中创建一个名为report.py的新Python文件。首先,我们导入所需的两个内置模块,并从JSON文件加载数据。
# report.py
import json
import string

with open('data.json') as f:
    data = json.loads(f.read())

现在,data变量是一个字典,其中包含作者的名称(键)和书名(值)作为键值对。接下来,我们生成HTML表,将其放入模板中(还记得占位符吗?)。因此,我们初始化一个空字符串,向其添加新的表行,如下所示。
content = ''for i, (author, title) in enumerate(data.items()):    content += '<tr>'    content += f'<td>{i + 1}</td>'    content += f'<td>{author}</td>'    content += f'<td>{title}</td>'    content += '</tr>'
该代码段显示了我们遍历数据字典中的所有项目,并将书名以及作者的名字放在相应的HTML标签中。我们创建了最终的HTML表。在下一步中,我们需要加载之前创建的模板文件:
with open('template.html') as t:
    template = string.Template(t.read())
注意,string.Template接受一个字符串,而不是一个文件路径。因此,您还可以提供在程序中先前创建的字符串,而无需将其保存到文件中。就我们而言,我们提供了template.html文件的内容。
最后,我们使用模板的replace()方法将占位符元素替换为存储在变量内容中的字符串。该方法返回一个字符串,我们将其存储在变量final_output中。最后但并非最不重要的一点是,我们创建了一个名为report.html的新文件,并将最终输出写入该文件。
final_output = template.substitute(elements=content)with open('report.html', 'w') as output:    output.write(final_output)
现在已经生成了第一个文件报告!如果在浏览器中打开report.html文件,则可以看到结果。
safe_substitution()方法
现在,您已经构建了第一个string.Template用例,在结束本文之前,我想与您分享一个常见情况及其解决方案:安全替换。它是什么?
让我们举个例子:您有一个字符串,您想在其中输入一个人的名字和姓氏。您可以按照以下步骤进行操作:
# 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)

但是,如果您错过传递一个或另一个的值会怎样?它引发一个KeyError。为避免这种情况,我们可以利用safe_substitution()方法。在这种情况下,safe意味着Python在任何情况下都尝试返回有效字符串。因此,如果找不到任何值,则不会替换占位符。
让我们按以下方式调整代码:
# safe_substitution.pyimport 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}
在某些情况下,这可能是一个更优雅的解决方案,甚至是必须的行为。但是这可能在其他地方引起意外的副作用。
本文概要
在阅读本文时,您不仅学习了Python字符串的基本知识。Template类以及使用它的原因,而且还实现了第一个文件报告脚本!此外,您已经了解了safe_substitution()方法以及在哪种情况下使用它可能会有所帮助。
(0)

相关推荐

  • 说说Python有几种字符串格式化?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Python实战013:如何将数据以JSON格式输出

    JSON(全称:JavaScript Object Notation) 是一种轻量级的数据交换格式,它的结构简洁.层次清晰也没有xml那么多标签描述让文件更加小巧且解析速度更快.非常适合做网络传输的数 ...

  • Flask结合ECharts实现在线可视化效果,超级详细!

    Python视界 来源|本文经授权转载自Python研究者 作者|李运辰 今天教大家如何利用Flask框架结合ECharts,将采集的数据实现在线可视化效果(可以将可视化效果放到网页上,分享给其他小伙 ...

  • FastJson 处理json数据中对象相互引用,最后转为json字符串出现占位符("$ref"标识循环引用)"的问题

    环境 fastjson 1.2.41 问题说明 FastJson 问题 在json对象中有多个地方引用了相同的对象,在经过几次转换转为json字符串的时候会出现占位符, 然后使用fastjson 解析 ...

  • VSCode Snippets 使用指南

    我们在写代码的过程中,常常会遇到一些固定的代码结构,形如输入一串console.log或者输入for的结构甚至是编写redux的reducers等等.反复写这些代码结构,不仅枯燥无聊,也会觉得效率不够 ...

  • pytest文档72- 使用 template 替换 yaml 文件的变量

    前言 在接口自动化测试的时候,yaml 文件一般放测试的数据或当配置文件使用,yaml 文件存放静态的数据是没问题的,python的数据类型基本上都是支持的. 有时候我们想在 yaml 文件中引用变量 ...

  • 用 Python 撸一个 Web 服务器-第4章:动态渲染数据

    上一章中为了尽快让 Todo List 程序跑起来,并没有完全按照 MVC 模式编写程序.这一章就让我们一起实现一个完整的 MVC 模式 Todo List 程序首页. 使用模型操作数据 我们来分析下 ...

  • selenium+python自动化90-多线程生成报告(BeautifulReport)

    前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生产一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完美的结合起来,就能生成报告了. 环境必备 ...

  • jenkins学习7-运行python自动化生成html报告

    前言 pytest脚本运行可以生成html的报告,jenkins上有生成html报告的插件,运行完成后直接在jenkins上显示 HTML Publisher 系统管理-插件管理-可选插件,搜索:HT ...

  • 神器Jinja2,用 Python 快速生成分析报告!

    数据管道 92篇原创内容 Official Account 01 前言 大家好,我是宝器. 在之前的文章中,我们使用 Python 开发了一个简单的基金购买策略的回测系统.在代码执行完毕后,会生成一系 ...

  • 如何1秒生成类案检索报告?

    案例检索对于法律人来说并不陌生,自2020年7月31日起,最高法<关于统一法律适用加强类案检索的指导意见>试行后,如何参照<意见>要求针对性检索类案,并以规范的类案检索报告形式 ...

  • 软网推荐:文件自动分类 生成分类报告

    是否想了解硬盘某分区中各种文件的分布情况?是否想知道仓储移动盘中收藏的各类文件的占比?光靠Windows 10自身的简单统计功能,恐怕不能让你满意.那么,就借用DiskSorter软件,为磁盘文件进行 ...

  • 用Python自动生成数据分析报告

    你好,我是林骥. 很多时候,我们需要做一些重复性的工作,比如说,每个月制作类似的数据分析报告,整个框架是基本固定的,此时,我们可以采用 Python 来自动生成数据分析报告,把更多的时间和精力用在分析 ...

  • 三种类案推送方式,助力一键生成检索报告|聚法类案检索

    今年下发的<关于统一法律适用加强类案检索的指导意见><关于完善统一法律适用标准工作机制的意见>,这两个文件都对在"互联网+"时代背景下的类案智能化工作提出了 ...

  • Python对数据写入Execl文件并生成图表

    Python对数据写入Execl文件并生成图表 需求: 为了做测试或者对爬虫程序爬取数据进行分析汇总,我们时常会将数据生成报表,但是如果我们想将报表生成在Excel中,这时候就可以借助xlsxwrit ...

  • Python办公自动化|批量生成请假条

    本文基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word,主要将涉及以下三个知识点 " openpyxl 读取 Excel 文件 python-docx 写入 Word 文件 ...