python - PyYAML 转储 bool 值

标签 python jinja2 pyyaml

我正在从 YAML 文件加载 yaml True/False 项目(下面的示例)。

gzip: False

这在 Jinja2 模板中被正确解释为 bool 值 True。

同一个 YAML 文件正在被另一个脚本读取,作为 python CGI 表单数据传递并最终写入 YAML 文件使用

with open(myyaml, 'w') as yaml_file:
    yaml_file.write(yaml.dump(dict, default_flow_style=False)) 

问题是这会用单引号写入 True/False

gzip: 'False'

这导致 jinja2 模板不将值解释为 bool 值并始终将值设置为 true

{{ if gzip }}

有没有办法转储具有被视为 bool 值(我的意思是没有引号)的 True/False 值的 YAML 文件。

最佳答案

.dump() 只是转储它获取的数据,它必须获取字符串而不是 bool 值作为键 gzip 的值。由于该字符串值,如果不加引号转储可能会被误解为 bool 值,它会被引用。

由于您从 CGI 表单中获取 Material ,任何值 TrueFalse 都将是一个字符串。在转储数据之前,您必须明确地将这些从 CGI 获得的值转换为 bool 值。

您可以在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”或“False”。如果这不是您想要的,则必须根据 key 选择转换。

你的两行 Python 还有另外两个主要问题:

with open(myyaml, 'w') as yaml_file:
    yaml_file.write(yaml.dump(dict, default_flow_style=False)) 
  1. 你永远不应该使用 Python 关键字 (dict) 作为变量名,那只会在你的代码中自找麻烦。
  2. yaml.dump() 将数据转储到流中。它有一个功能,如果您不指定必须到达的流,输出将写入内部流对象,最终值从该对象返回。你不应该滥用它,然后将这个返回值写入 yaml_file。而是这样做:

    with open(myyaml, 'w') as yaml_file:
        yaml.dump(dict, yaml_file, default_flow_style=False))
    

    你的方式效率低下(除了表现出缺乏理解)。

关于python - PyYAML 转储 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40394852/

相关文章:

python - lxml 经典 : Get text content except for that of nested tags?

python - 同时对索引和列重新建立索引

python - 如何使用 px.bar() 在堆积条形图中显示百分比值?

python - 自动检测 Jinja2 文件并在 Sublime Text 中激活适当的突出显示

python - YAML 列表 -> Python 生成器?

python - 使用 df1 中的值从 df2 中检索值,其中 df2 列和索引包含一系列值

python - 使用 flask 查找jinja2模板中的数字总和

python - 尝试在 render_template() (Flask)之后使用访问另一个作用域中的变量?

python - 从包含特殊字符(星号、符号、*、&)的 python 字典写入 YAML 文件

python - pyyaml 正在产生不希望的 !!python/unicode 输出