应用开发

用 Python 的 Template 类生成文件报告

时间:2010-12-5 17:23:32  作者:数据库   来源:数据库  查看:  评论:0
内容摘要:介绍很多时候,我发现自己需要进行生成报告、输出文件或字符串的任务。它们或多或少都会遵循某种模式,通常这些模式是如此相似,以至于我们希望拥有一个可以重用并直接输入数据的模板。幸运的是,Python提供了

介绍

很多时候,类生我发现自己需要进行生成报告、成文输出文件或字符串的类生任务。它们或多或少都会遵循某种模式,成文通常这些模式是类生如此相似,以至于我们希望拥有一个可以重用并直接输入数据的成文模板。幸运的类生是,Python提供了一个可以帮助我们的成文类:string.Template。

在本文中,类生您将学习如何利用此类根据当前使用的成文数据生成输出文件,以及如何以相同的类生方式操作字符串。因此,成文本文不仅使用您在日常工作中可能遇到的类生示例,还为您提供了许多您可能知道的成文实际工具,并且该工具将此类用于生成报告文件。类生下面让我们开始吧!

注意:本文基于Python 3.9.0(CPython)。您可以在GitHub(https://github.com/DahlitzFlorian/generate-file-reports-using-pythons-template-class)上找到整篇文章中使用的代码示例。

在看一个示例之前,让我们花一些时间来看看使用string.Template相对于其他解决方案的优势。

1、无需其他依赖项,IT技术网开箱即用,因此不需要使用pip install命令安装。

2、它是轻量级的,当然诸如Jinja2和Mako之类的模板引擎已被广泛使用。但是,在本文介绍的方案中,这些功能是过分地夸大了。

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。

Great Books of All Time

Great Books of All Time

#

Author

Book Title

${elements}

</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 += ""

content += f"{i + 1}"

content += f"{author}"

content += f"{title}"

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.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}

在某些情况下,这可能是一个更优雅的解决方案,甚至是必须的行为。但是这可能在其他地方引起意外的副作用。

本文概要

在阅读本文时,您不仅学习了Python字符串的基本知识。Template类以及使用它的原因,而且还实现了第一个文件报告脚本!此外,您已经了解了safe_substitution()方法以及在哪种情况下使用它可能会有所帮助。

揭秘电脑连WiFi密码错误的可能原因(解密密码错误背后的秘密和解决方法)
不是我不明白,这世界变化快!微软面向 Linux 平台推出了 Visual Studio 2015!昔日的对头,如今正走向融合。这么喜大普奔的事,我准备挑战一下微软重量级软件在 Linux 平台上的安装。然没想到哇。根本没有我想象中的挑战性。看完你就知道了。软件名称:Visual Studio 2015 旗舰版 官方最新版软件大小:1.69MB更新时间:2014-11-171、百度 “Visual Studio Downloads”这一溜关键词,在搜索结果中打开 Visual Studio 的主页。2、可以看到页面上有三个磁贴状方块,最右边的是 Visual Studio Code,我们点击它里面的“下载”。3、进入下载页面,页面上地址栏下方的黄色条带里提示有更新的版本,当然,大家要更新的。先点那个黄条里的 New features,看看有啥新鲜东西。4、各种改进,包括文件管理、编辑器选项、JavaScript 支持升级、Git 增强等等。那还等什么,点击上方黄条上的 Update,去下载升级版吧。5、在接下来的页面,我们点击 Updating on Linux 一节里的链接,开始下载。有两个链接,分别是 64 位的和 32 位的,根据自己的情况选择。6、下载完成之后,点击下载管理器里的“在文件夹中显示”,导航到刚才下载的软件包所在的文件夹。7、在软件包上右键——>提取到此处,开始解压软件包。8、解压完成,进入与软件压缩包同名的文件夹,在一个名为 Code 的可执行文件上双击。9、DUANG!Linux 平台上的微软重量级软件一下出现在眼前。原来,Visual Studio Code 是不开源的,我刚开始想象的软件编译呀,软件包依赖呀等挑战,从开始就不存在好嘛。现在,各位年轻的码农,一切就看你们的了。10、假如和我一样觉得无从下手,好吧,附送免费视频培训,我的名字叫雷锋。
copyright © 2025 powered by 编程之道  滇ICP备2023006006号-34sitemap