Python 利用 Jinja2 模版生成文件

工作中遇到了这种场景:需要生成批量文件,文件格式一致,其中的变量根据数据库的数据生成。这里就想到了之前 Ansible 中的 template 的处理方式,可以使用 Jinja2 模版,再结合 Python 脚本进行处理生成目标文件。

Jinja2 简介

Jinja2 是基于 Python 的模板引擎,功能比较类似于于 PHP 的 smarty,J2ee 的 Freemarker 和 velocity。 它能完全支持 unicode,并具有集成的沙箱执行环境,应用广泛。使用 Jinja2 的方式一般是,先创建一个包括 {{ }} {% %} 等特殊符号的模板文件,然后用 Jinja 的模板对象加载,然后变量值对该模板中的变量进行赋值。

示例

简单示例

1
2
3
4
from jinja2 import Template

template = Template('Hello {{ name }}!')
print(template.render(name='World'))

运行结果:

1
2
$ python test.py
Hello World!

结合模版文件

Jinja2 使用一个名为 Environment 的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过 Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境。大多数应用在应用初始化时创建一个 Environment 对象,并用它加载模板。

  • 项目结构:
1
2
3
4
5
6
7
8
9
10
.
├── results
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-35.pyc
│   └── templates
│   └── test.j2
└── test.py

3 directories, 4 files

注意点:

  1. __init__.py 是必需的,否则会出现 NotImplementedError: Can’t perform this operation for unregistered loader type 的异常。
  2. 模版文件 test.j2 需要放在 templates 目录下,否则会出现 jinja2.exceptions.TemplateNotFound 的异常
  • 准备模版文件
1
2
Hi, I am {{ name }}, {{ age }} years old.
I'm from {{ country }}.
  • Jinja2 处理脚本
1
2
3
4
5
6
7
from jinja2 import Environment, PackageLoader

env = Environment(loader=PackageLoader('results'))
template = env.get_template('test.j2')
content = template.render(name='liuhao', age='18', country='China')

print(content)
  • 运行结果
1
2
3
$ python test.py
Hi, I am liuhao, 18 years old.
I'm from China.

至此,简单的 Python 处理 Jinjia2 的逻辑基本完成,可以在此基础上进行业务逻辑的拓展,比如生成文件等。

生成文件可以参考如下代码:

1
2
3
4
5
6
7
8
9
from jinja2 import Environment, FileSystemLoader

env = Environment(loader = FileSystemLoader("./"))
template = env.get_template("test.j2")

content = template.render(name='liuhao', age='18', country='China')

with open('./test.conf','w') as fp:
fp.write(content)

Jinja2 的高级特性可以参考官方文档,同时也有中文版


参考:

https://blog.csdn.net/wangjianno2/article/details/51044780

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/python-jinja2.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%