我正在从YAML文件加载yaml True / False项目(下面的示例)。
gzip: False
这在Jinja2模板中被正确解释为布尔值True。
另一个脚本读取相同的YAML文件,作为python CGI表单数据传递,最后使用
写入YAML文件with open(myyaml, 'w') as yaml_file:
yaml_file.write(yaml.dump(dict, default_flow_style=False))
问题是,然后使用单引号
写入True / Falsegzip: 'False'
导致jinja2模板不将值解释为boolean并始终将值设置为true
{{ if gzip }}
有没有办法使用被视为布尔值的True / False值转储YAML文件(我的意思是没有引号)。
答案 0 :(得分:1)
.dump()
只是转储它获得的数据,它必须得到一个字符串而不是布尔值作为键gzip
的值。由于该字符串值,如果不加引号转储可能被误解为布尔值,则会被引用。
由于您从CGI表单获取材料,因此任何值True
或False
都将是一个字符串。在转储数据之前,您必须明确地将从CGI获得的这些值转换为布尔值。
您可以在dump
之前浏览字典并执行一般处理:
import sys
import yaml
# simulating getting string type values from CGI
data = dict(gzip='False', intval="1", strval="abc")
for k in data:
v = data[k]
try:
v = int(v)
data[k] = v
except ValueError:
vl = v.lower()
if vl == 'false':
data[k] = False
elif vl == 'true':
data[k] = True
yaml.safe_dump(data, sys.stdout, default_flow_style=False)
给出:
gzip: false
intval: 1
strval: abc
请注意,abc
未引用,因为它不能被解释为除字符串之外的任何其他内容。上面当然也会转换字符串' True'或者“假”'这将不得不保持弦乐。如果这不是您想要的,您必须根据密钥选择转换。
你的两行Python存在另外两个主要问题:
with open(myyaml, 'w') as yaml_file:
yaml_file.write(yaml.dump(dict, default_flow_style=False))
dict
)作为变量名,这只会在你的代码中遇到麻烦。 yaml.dump()
将数据转储到流中。它有一个功能,如果你没有指定事物必须去的流,输出将被写入内部流对象,从中返回最终值。您不应滥用此权限,然后将此返回值写入yaml_file
。而是做:
with open(myyaml, 'w') as yaml_file:
yaml.dump(dict, yaml_file, default_flow_style=False))
你的方式效率低下(除了缺乏理解)。