我有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 %}
答案 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 %}