Python 使用jinja2模板迭代多级yaml映射

Python 使用jinja2模板迭代多级yaml映射,python,yaml,jinja2,Python,Yaml,Jinja2,目前,我正试图通过循环访问所有键来访问位于不同地图“级别”的YAML键。循环通过前两个“级别”是有效的,但不会比这更深。代码仍在运行。它只是没有进入下一个循环 我尝试了for循环的不同变体: 亚马尔: jinja2模板: {% for l0 in root %} test0 {% for l1 in l0.sub %} test1 {% for l2 in l1.sub %} test2 {% for l3 in l2.sub %} test3

目前,我正试图通过循环访问所有键来访问位于不同地图“级别”的YAML键。循环通过前两个“级别”是有效的,但不会比这更深。代码仍在运行。它只是没有进入下一个循环

我尝试了for循环的不同变体:

亚马尔:

jinja2模板:

{% for l0 in root %}
test0
  {% for l1 in l0.sub %}
  test1
    {% for l2 in l1.sub %}
    test2
      {% for l3 in l2.sub %}
      test3
      {% endfor %}
    {% endfor %}
  {% endfor %}
{% endfor %}

谢谢你给我的任何帮助

根目录
包含一个序列。因此,您最外层的循环在
根目录中的序列项上迭代,这很好

第二个循环从当前项查询
sub
的值
sub
包含的不是序列,而是映射。映射被加载到Python dict对象中。在Python中,dict对象上的
for
循环在键上迭代。在迭代过程中,
l1
将包含以下字符串值:

"key3"
"key4"
"map"
"sub"
由于这些都是字符串,
l1.sub
不存在,因此第三个循环永远不会执行

现在,要解决这个问题,您需要考虑数据的含义。奇怪的是,第9行嵌套的
sub
确实再次包含序列,而第5行的初始
sub
却没有。也许您的问题在于数据和外部
sub
实际上应该包含一个序列

对以下数据执行模板将使用内部循环:

---
root:
- key1: bla
  key2: bla
  sub:
  - key3: bla  # note the additional `-` here
    key4: bla
    map: {key5: bla, key6: bla, key7: bla} 
    sub:
    - key8
      sub:    # added to reach the innermost loop
      - key9
...
如果数据正确,您应该考虑是否确实要执行
l1
循环,或者是否要执行此操作:

{% for l1 in l0.sub.sub %}

这直接进入内部
,它实际上是一个序列。

包含一个序列。因此,您最外层的循环在
根目录中的序列项上迭代,这很好

第二个循环从当前项查询
sub
的值
sub
包含的不是序列,而是映射。映射被加载到Python dict对象中。在Python中,dict对象上的
for
循环在键上迭代。在迭代过程中,
l1
将包含以下字符串值:

"key3"
"key4"
"map"
"sub"
由于这些都是字符串,
l1.sub
不存在,因此第三个循环永远不会执行

现在,要解决这个问题,您需要考虑数据的含义。奇怪的是,第9行嵌套的
sub
确实再次包含序列,而第5行的初始
sub
却没有。也许您的问题在于数据和外部
sub
实际上应该包含一个序列

对以下数据执行模板将使用内部循环:

---
root:
- key1: bla
  key2: bla
  sub:
  - key3: bla  # note the additional `-` here
    key4: bla
    map: {key5: bla, key6: bla, key7: bla} 
    sub:
    - key8
      sub:    # added to reach the innermost loop
      - key9
...
如果数据正确,您应该考虑是否确实要执行
l1
循环,或者是否要执行此操作:

{% for l1 in l0.sub.sub %}

这直接进入内部的
,它实际上是一个序列。

我不相信您在这里提供的示例数据和代码实际上证明了您所描述的问题。请更新您的问题,以便在与所包含的模板一起使用时,样本数据将再现错误。我不相信您在这里提供的样本数据和代码实际上证明了您所描述的问题。请更新您的问题,以便在与包含的模板一起使用时,样本数据将重现错误。哇,谢谢!这真的帮助我更好地理解了YAML语法。哇,谢谢!这确实帮助我更好地理解了YAML语法。