在python中呈现和加载yaml文件

2024-04-18 15:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图加载一个jinja2格式的yaml文件并“评估”/“呈现”模板。下面是一个例子:

{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}

我希望能够加载yaml文件并说yaml['package']['version']=0.3.3

我不得不尝试ruamelyaml,但它不评估版本只给我一个包。在

这里是python代码:

^{pr2}$

Tags: 文件name版本模板jinja2yamlpackageversion
3条回答

不确定ruamel.yaml,但您可以轻松地使用jinja2包和pyyaml包执行您想要的操作:

from jinja2 import Environment, BaseLoader
import yaml

content = '''{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}'''

yaml_content = yaml.safe_load(Environment(loader=BaseLoader()).from_string(content).render())
print(yaml_content['package']['version'])

该输出:

^{pr2}$

我不知道你有什么完整的例子,但这里是我要做的。如果我没弄错,你想加载一个jinja文件,然后通过ruamel.yaml包获取值

from ruamel.yaml import YAML
from jinja2 import Environment, FileSystemLoader

jinja = Environment(loader = FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True)
template = jinja.get_template('sample.yml')
yaml=YAML()
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(template.render())
print (yaml_content['package'])
^{pr2}$

结果:

{'name': 'pyexcel-ezodf', 'version': '0.3.3'}

关于使用typ='jinja2'ruamel不支持,除非您有一些自定义设置,如下所示:

NotImplementedError: typ "jinja2"not recognised (need to install plug-in?)

通过传递给ruamel.yaml'YAML()实例的typ='jinja2'参数为YAML加载jinja2模板,以便从模板中生成有效的YAML,因此您可以修改模板,将其视为有效的YAML并将其写回。它不进行任何模板渲染,也不在文档中的任何地方声明这样做。在

您需要做的是首先使用jinja2呈现模板,然后加载该值(您可以使用fastyaml = YAML(typ='safe')选项)。在

例如,您可以做如下操作:

from jinja2 import Environment
from ruamel.yaml import YAML

yaml = YAML(typ='safe')
yaml_content = yaml.load(Environment().from_string(content).render())
print(yaml_content['package'])

相关问题 更多 >