Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查keys变量是否存在并防止打印该keys+;jinja2模板中的值为空_Python_Python 2.7_Yaml_Jinja2 - Fatal编程技术网

Python 如何检查keys变量是否存在并防止打印该keys+;jinja2模板中的值为空

Python 如何检查keys变量是否存在并防止打印该keys+;jinja2模板中的值为空,python,python-2.7,yaml,jinja2,Python,Python 2.7,Yaml,Jinja2,我有一个jinja2模板,它以“keys:value”的形式从yaml获取数据变量 问题是当我运行jinja2模板时,它将打印具有空“值”的行 如何才能使它不打印空行。否则,它将显示为“无” 比如, -模板 set first {{ABC}} set second {{DEF}} set third {{GHI}} -yaml数据 ABC : data1 DEF : GHI : data3 如果我运行此命令,它将声明: set first data1 set second None set

我有一个jinja2模板,它以“keys:value”的形式从yaml获取数据变量

问题是当我运行jinja2模板时,它将打印具有空“值”的行

如何才能使它不打印空行。否则,它将显示为“无”

比如,

-模板

set first {{ABC}}
set second {{DEF}}
set third {{GHI}}
-yaml数据

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 %}
您可以使用


这将验证每个值是否存在。如果它不存在,则跳过该行,并且给定的
{%If%}{%endif%}
块中没有任何内容被写入。

您可以使用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'}
编辑2: 你能把Jinja模板改成这样吗

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

是的,没错,我也通过导入jinja2和yaml使用Python。那么,我该怎么做呢?@k-rd在Anwer中添加了一个我想建议的示例,即编辑1。无论如何,它仍然会在模板中显示对应于未定义的“键”的变量。如何获取输出,使其仅打印定义的键。例如:设置第一个数据1设置第三个数据data3@k-你能分享你的代码吗?我认为代码中有一些bug,因为字典已经更新,不再有密钥,所以不应该显示在模板中。我在这里添加了代码。该键不会显示在模板中,但仍会显示模板中与该键对应的变量。如果可以,我不希望它也显示变量。您没有使用变量
k
v
。这可能有助于您理解事物是如何工作的——我建议您学习python如何与Jinja交互以及Jinja如何工作的基础知识。这是一个使用Flask的好例子,但概念可以推广-
{% for k, v in yaml_input_data.iteritems() %}
    {# use k, v #}
{% endfor %}