最简单的报告是生成一些文本并将其存储在文件中。
对于这个配方,我们将以文本格式生成简要报告。要存储的数据将在一个字典中。
>>>fromdatetimeimportdatetime>>>TEMPLATE='''Moviesreport-------------Date:{date}Moviesseeninthelast30days:{num_movies}Totalminutes:{total_minutes}'''>>>data={'date':datetime.utcnow(),'num_movies':3,'total_minutes':376,}>>>report=TEMPLATE.format(**data)>>>FILENAME_TMPL="{date}_report.txt">>>filename=FILENAME_TMPL.format(date=data['date'].strftime('%Y-%m-%d'))>>>filename2018-06-26_report.txt>>>withopen(filename,'w')asfile:...file.write(report)$cat2018-06-26_report.txtMoviesreport-------------Date:2018-06-2623:40:08.737671Moviesseeninthelast30days:3Totalminutes:376工作原理...如何操作...部分的第2步和第3步设置了一个简单的模板,并添加了包含报告中所有数据的字典。然后,在第4步,这两者被合并成一个特定的报告。
在第4步中,将字典与模板结合。请注意,字典中的键对应模板中的参数。诀窍是在format调用中使用双星号来解压字典,将每个键作为参数传递给format()。
在第5步中,生成的报告(一个字符串)存储在一个新创建的文件中,使用with上下文管理器。open()函数根据打开模式w创建一个新文件,并在块期间保持打开状态,该块将数据写入文件。退出块时,文件将被正确关闭。
打开模式确定如何打开文件,无论是读取还是写入,以及文件是文本还是二进制。w模式打开文件以进行写入,如果文件已存在,则覆盖它。小心不要错误删除现有文件!
第6步检查文件是否已使用正确的数据创建。
文件名使用今天的日期创建,以最小化覆盖值的可能性。日期的格式从年份开始,以天结束,已选择文件可以按正确顺序自然排序。
即使出现异常,with上下文管理器也会关闭文件。如果出现异常,它将引发IOError异常。
在写作中一些常见的异常可能是权限问题,硬盘已满,或路径问题(例如,尝试在不存在的目录中写入)。
请注意,文件可能在关闭或显式刷新之前未完全提交到磁盘。一般来说,处理文件时这不是问题,但如果尝试打开一个文件两次(一次用于读取,一次用于写入),则需要牢记这一点。
HTML是一种非常灵活的格式,可用于呈现丰富的报告。虽然可以将HTML模板视为纯文本创建,但也有工具可以让您更好地处理结构化文本。这也将模板与代码分离,将数据的生成与数据的表示分开。
此配方中使用的工具Jinja2读取包含模板的文件,并将上下文应用于它。上下文包含要显示的数据。
我们应该从安装模块开始:
$echo"jinja2==2.20">>requirements.txt$pipinstall-rrequirements.txtJinja2使用自己的语法,这是HTML和Python的混合体。它旨在HTML文档,因此可以轻松执行操作,例如正确转义特殊字符。
在GitHub存储库中,我们已经包含了一个名为jinja_template.html的模板文件。
如何做...部分中的步骤2和4非常简单:它们读取模板并保存生成的报告。
如步骤3和4所示,主要任务是创建一个包含要显示信息的上下文字典。然后模板呈现该信息,如步骤5所示。让我们来看看jinja_template.html:
Date{{date}} Moviesseeninthelast30days:{{movies|length}} Totalminutes:{{total_minutes}}MoviesReport
{%formovieinmovies%}