如何用Jinja2模板将Python字典中的列表动态展开为YAML?
问题:如何用Jinja2动态展开Python字典生成YAML,无需硬编码键名和元素数量?
现有Python代码用于通过Jinja2模板生成YAML文件:
from jinja2 import Environment, FileSystemLoader import glob def map_template(context,template_path,template_name,destination): environment = Environment(loader = FileSystemLoader(template_path), trim_blocks=True, lstrip_blocks=True) results_filename = destination results_template = environment.get_template(template_name) with open(results_filename, mode="w", encoding="utf-8") as results: results.write(results_template.render(context)) print(f"... wrote {results_filename}")
上下文结构如下:
{'node' : {'value' : [{'key1':val1,'key2':"str2",'key3':val3}] } }
期望生成的YAML输出:
node: - key1:val1 key2:"str2" key3: val3
当前模板采用硬编码方式,需要手动指定每个键名和列表索引:
node: - {{node.value[0].key1}} {{node.value[0].key2}} {{node.value[0].key3}}
现询问是否存在无需硬编码元素数量和键名,即可用Jinja2模板动态展开列表的方法?
解决方案
完全可以,利用Jinja2的循环语法就能实现动态展开,无需硬编码任何键名或列表长度。
核心思路
- 遍历
node.value列表中的每个字典元素,对应YAML里的每个-条目 - 对每个字典,遍历其键值对,动态生成YAML的键值行
最终Jinja2模板
node: {% for item in node.value %} - {% for key, value in item.items() %} {{ key }}: {% if value is string %}"{{ value }}"{% else %}{{ value }}{% endif %} {% endfor %} {% endfor %}
细节说明
- 外层循环处理列表中的所有元素,哪怕
node.value有多个字典,也能自动生成对应YAML条目 - 内层循环遍历字典的所有键值对,不需要提前知道键名
- 加入字符串判断逻辑,确保字符串类型的值被包裹在双引号中,和期望输出格式一致
- 模板缩进需和YAML格式匹配,保证生成的文件语法合法
扩展场景测试
如果node.value包含多个字典元素:
{'node' : {'value' : [ {'key1':val1,'key2':"str2",'key3':val3}, {'key4':val4,'key5':"str5"} ]} }
使用上述模板会自动生成:
node: - key1: val1 key2: "str2" key3: val3 - key4: val4 key5: "str5"
内容的提问来源于stack exchange,提问作者Kspr
相关产品推荐
相关产品推荐

