使用jinja2 temp遍历多级yaml映射

2024-05-18 07:35:05 发布

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

目前,我正在尝试通过循环访问所有键来访问位于不同映射“级别”的YAML键。循环通过前两个“层次”的工作,但并不比这更深。代码仍在运行。只是没有进入下一个循环。你知道吗

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

亚马尔:

---
root:
- key1: bla
  key2: bla
  sub:
    key3: bla
    key4: bla
    map: {key5: bla, key6: bla, key7: bla} 
    sub:
    - key8
.
.
. 

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 %}

谢谢你的帮助!你知道吗


Tags: 代码inl1yamlforroot变体级别
1条回答
网友
1楼 · 发布于 2024-05-18 07:35:05

root包含一个序列。因此,最外层的循环在root中的序列项上迭代,这很好。你知道吗

第二个循环从当前项查询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,实际上是一个序列。你知道吗

相关问题 更多 >