如何在 python yaml 文件中输出空白值

Posted

技术标签:

【中文标题】如何在 python yaml 文件中输出空白值【英文标题】:How can I output blank value in python yaml file 【发布时间】:2015-07-19 23:26:09 【问题描述】:

我正在写这样的yaml文件

with open(fname, "w") as f:
     yaml.safe_dump('allow':'', 'deny': '', f,
                    default_flow_style=False, width=50, indent=4)

这个输出:

allow: ''

我想输出为

allow:

我该怎么做?

【问题讨论】:

您基本上是想将其设置为 null 而不是空字符串? 您在问如何保存与实际数据不同的值?为什么?如果实际数据是空字符串,那么该数据的 yaml 表示也应该是空字符串,不是吗?您是否尝试将原始值设置为 None @BryanOakley ,如果我放 None ,那么它在 yaml 中显示 null 。我想保持空白。我是硬编码值。我正在寻找可以在实际值中使用的变量来提供空白输出,例如 null , None 等。我不想使用替换 在 YAML 中,一个空值被解释为 null,那么有什么区别呢?只需使用None。它会以同样的方式被解释。当然,除非有一些非常具体的原因需要它为空白,无论它是如何解释的。在这种情况下,您可能想让我们知道,以便我们提供帮助。也许知道您请求的上下文,有人可能会建议一种不同的方式来获得您想要的东西。 @Waylan 在我看到的所有 yaml 文件中,if 键通常为空,而不是(null or None or ''),所以我只想创建这样的文件,这样如果我想写点东西那么我不需要删除那些不需要的字符 【参考方案1】:

如果你加载一个 YAML src

allow:

在 Python 中,您会将 None 分配给键 allow,这是正确的行为。

如果您使用ruamel.yaml(我是其作者),并且它的RoundTripDumperNone 是按照您的意愿编写的(这是 IMO 最易读的,虽然不是明确的):

import ruamel.yaml

print ruamel.yaml.dump(dict(allow=None), Dumper=ruamel.yaml.RoundTripDumper)

会给你:

allow:

你也可以正确地往返这个:

import ruamel.yaml

yaml_src = """
allow:
key2: Hello  # some test

"""

data = ruamel.yaml.load(yaml_src, ruamel.yaml.RoundTripLoader)
print('#### 1')
print(data['allow'])
print('#### 2')
print(ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper))

print('#### 3')

print(type(data))

作为输出:

#### 1
None
#### 2
allow:
key2: Hello  # some test


#### 3
<class 'ruamel.yaml.comments.CommentedMap'>

在上面,data 是ordereddict 的子类,它是跟踪输入的flowstyle、处理附加到行的cmets、键的顺序等所必需的。 这样的子类可以即时创建,但通常更容易从一些可读且格式良好的 YAML 代码开始(可能已经保存在磁盘上),然后更新/扩展这些值。

【讨论】:

【参考方案2】:

使用替换,这看起来很简单:

import yaml

fname = 'test.yaml'
with open(fname, "w") as f:
    yaml_str = yaml.safe_dump('allow':'', 'deny': '',
                            default_flow_style=False,
                            width=50, 
                            indent=4).replace(r"''", '')
    f.write(yaml_str)

你有什么理由要避开replace

有一个缺点是重新加载 yaml 文件不会重现您的输入:

>>> print yaml.safe_load(open(fname))
'deny': None, 'allow': None

【讨论】:

【参考方案3】:
from yaml import SafeDumper
import yaml

data = 'deny': None, 'allow': None

SafeDumper.add_representer(
    type(None),
    lambda dumper, value: dumper.represent_scalar(u'tag:yaml.org,2002:null', '')
  )

with open('./yadayada.yaml', 'w') as output:
  yaml.safe_dump(data, output, default_flow_style=False)

有一种方法可以在 python yaml 本身中内置。上面的代码将生成一个文件,其中包含:

allow:
deny:

【讨论】:

我认为这应该是正确的答案。似乎是最干净的解决方案,可以通过库的适当内部结构适当地解决这个问题。 完美!你拯救了我的一天【参考方案4】:

对于要从 python 读取的 None 类型,请在 yaml 中使用 null

像这样的 YAML 文件 test.yml

foo: null
bar: null

将被python读取为

import yaml
test = yaml.load(open('./test.yml'))
print(test)

foo: None
bar: None

【讨论】:

这是真的,但不是 OP 要求的。

以上是关于如何在 python yaml 文件中输出空白值的主要内容,如果未能解决你的问题,请参考以下文章

python中使用yaml模块

配置文件语言之yaml

python - 在Python中使用Dictwriter输出时,为啥CSV文件在每个数据行之间包含一个空白行[重复]

如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?

如何在yaml文件中引用python函数?

我可以在 yaml/pyyaml 中转储空白而不是 null 吗?