如何检查键变量存在并防止jinja2模板中键+值为空的打印行

时间:2016-11-16 03:15:14

标签: python python-2.7 yaml jinja2

我有jinja2模板,它以'键的形式从yaml获取数据变量:value'。

问题是当我运行jinja2模板时,它会打印出空的'值'。

我怎么能这样做,它不会打印空的行。否则,它将显示无。

例如;

-Template

set first {{ABC}}
set second {{DEF}}
set third {{GHI}}

-yaml data

ABC : data1
DEF :
GHI : data3

如果我运行它,它将说明;

set first data1
set second None
set third data3

我不希望这样。我想要它打印;

set first data1
set third data3

如何做到这一点?如果变量未定义则阻止添加行。

谢谢,

更新了脚本: -

TEMPLATE_FILE = { 'trial_1': 'trial.tcl' }
    for f,s in TEMPLATE_FILE.items():

    template = templateEnv.get_template( s )

    with open('tmp.yaml', 'rb') as stream:
        try:
            yaml_input_data = yaml.load(stream)
        except yaml.YAMLError as exc:
            pass
    print(yaml_input_data)

    for k, v in yaml_input_data.items():
        if v is None:
            yaml_input_data.pop(k)
    print(yaml_input_data)

    with open(f, 'w') as outfile:    
        outfile.writelines(template.render(yaml_input_data))
    print '\nWrote',f

更新了jinja2模板

{% for k, v in yaml_input_data.iteritems() %}
    {# use k, v #}
set first {{ABC}}
set second {{DEF}}
set third {{GHI}}
{% endfor %}

2 个答案:

答案 0 :(得分:0)

您可以使用Jinja2 conditional blocks

{%if%}{%endif%}

这将验证每个值是否存在。如果它不存在,则跳过该行,并且写入给定 resp3 = Console.ReadLine(); if (resp3 == "tell me the curent date and time") { Console.Write(string.Format("{0:HH:mm:ss tt}", DateTime.Now)); } Console.ReadLine(); 块内的任何内容。

答案 1 :(得分:0)

你可以使用Jinja的{% if variable %}块 - @ Jalepeno112可以很好地回答这个问题。但是,如果可能的话,我建议将YAML解析为数据结构,如python中的字典,然后使用Jinja模板中的数据结构。

这将使您有机会清除python中的数据,然后只发送存在的值。

我在这里假设YAML正在通过python传递给Jinja,因为你还在问题中添加了python标签。

编辑1: 有多种方法可以实现这一点,但添加一个简单的例子来说明我的意思。

with open('tmp.yaml', 'r') as stream:
    try:
        yaml_input_data = yaml.load(stream)
    except yaml.YAMLError as exc:
        # handle error
        pass

print(yaml_input_data)
# {'ABC': 'data1', 'DEF': None, 'GHI': 'data3'}

for k, v in yaml_input_data.items():
    if v is None:
        yaml_input_data.pop(k)

# Now pass yaml_input_data to the Jinja template
print(yaml_input_data)
#{'ABC': 'data1', 'GHI': 'data3'}

EDIT2: 你能把Jinja模板改成这样的东西吗?

{% for k, v in yaml_input_data.iteritems() %}
    {# use k, v #}
{% endfor %}