我正在从yaml文件中加载一个YAML真/假项(下面的例子)。
gzip: False这在Jinja2模板中被正确地解释为布尔True。
相同的YAML文件正在被另一个脚本读取,作为python格式数据传递,并最终使用
with open(myyaml, 'w') as yaml_file:
yaml_file.write(yaml.dump(dict, default_flow_style=False)) 问题是,这会用单引号写真假
gzip: 'False',这将导致jinja2模板不将值解释为布尔值,而总是将值设置为true
{{ if gzip }}是否有一种方法可以转储具有True/False值的YAML文件,这些值被视为布尔值(我的意思是没有引号)。
发布于 2016-11-03 07:36:33
.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没有被引用,因为它只能被解释为字符串。上述当然也转换字符串‘真’或‘假’,将必须保持字符串。如果这不是您想要的,您必须根据键选择转换。
Python的两行代码还有另外两个主要问题:
with open(myyaml, 'w') as yaml_file:
yaml_file.write(yaml.dump(dict, default_flow_style=False)) dict)作为变量名,这只是在以后的代码中自找麻烦。yaml.dump()将数据转储到流。它具有一种功能,如果您不指定必须指向的流,输出将被写入内部流对象,从该对象返回最终值。您不应该滥用它,然后将返回的值写入yaml_file。相反,请做:
打开(myyaml,'w')作为yaml_file: yaml.dump(dict,yaml_file,default_flow_style=False))
你的方式效率很低(除了表现出缺乏理解)。https://stackoverflow.com/questions/40394852
复制相似问题