在python中渲染并加载yaml文件

时间:2019-02-28 22:10:24

标签: python jinja2 pyyaml ruamel.yaml

我正在尝试加载jinja2格式的yaml文件并“评估” /“渲染”模板。这里是示例:

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

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

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

我必须尝试ruamel YAML,但它不会评估该版本,只能给我一个软件包。

此处是python代码:

yaml = YAML(typ='jinja2')
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(content)
print (yaml_content['package'])

3 个答案:

答案 0 :(得分:1)

这里有通过传递给%cd %bookmark 'typ='jinja2'实例的ruamel.yaml参数为YAML加载jinja2模板的功能,以便从模板中生成有效的YAML,因此您可以修改模板好像它是有效的YAML并将其写回。它不执行任何模板渲染,也不声称在文档的任何地方都进行了渲染。

您需要做的是首先使用jinja2渲染模板,然后加载该值(可以使用快速的YAML()选项。

您可以例如做类似的事情:

yaml = YAML(typ='safe')

答案 1 :(得分:0)

不确定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']) ,但是您可以使用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'])

答案 2 :(得分:0)

我不确定您所拥有的完整示例是什么,但是这是我必须使之工作的全部。如果我正确地知道了这个,您想加载一个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'])
#sample.yml
{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

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

结果:

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

除非您有一些自定义设置,否则typ='jinja2'不支持使用ruamel

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