工作中遇到了这种场景:需要生成批量文件,文件格式一致,其中的变量根据数据库的数据生成。这里就想到了之前 Ansible 中的 template 的处理方式,可以使用 Jinja2 模版,再结合 Python 脚本进行处理生成目标文件。
Jinja2 简介
Jinja2 是基于 Python 的模板引擎,功能比较类似于于 PHP 的 smarty,J2ee 的 Freemarker 和 velocity。 它能完全支持 unicode,并具有集成的沙箱执行环境,应用广泛。使用 Jinja2 的方式一般是,先创建一个包括 {{ }}
或 {% %}
等特殊符号的模板文件,然后用 Jinja 的模板对象加载,然后变量值对该模板中的变量进行赋值。
示例
简单示例
1 | from jinja2 import Template |
运行结果:
1 | $ python test.py |
结合模版文件
Jinja2 使用一个名为 Environment 的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过 Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境。大多数应用在应用初始化时创建一个 Environment 对象,并用它加载模板。
- 项目结构:
1 | . |
注意点:
__init__.py
是必需的,否则会出现 NotImplementedError: Can’t perform this operation for unregistered loader type 的异常。- 模版文件 test.j2 需要放在 templates 目录下,否则会出现 jinja2.exceptions.TemplateNotFound 的异常
- 准备模版文件
1 | Hi, I am {{ name }}, {{ age }} years old. |
- Jinja2 处理脚本
1 | from jinja2 import Environment, PackageLoader |
- 运行结果
1 | $ python test.py |
至此,简单的 Python 处理 Jinjia2 的逻辑基本完成,可以在此基础上进行业务逻辑的拓展,比如生成文件等。
生成文件可以参考如下代码:
1 | from jinja2 import Environment, FileSystemLoader |
参考: