在YAML文件为空时加载空字典(Python 3.4)

时间:2016-02-29 02:36:08

标签: python dictionary yaml

我有一个空的YAML文件,当我加载它时,我想将其作为空字典加载。例如,我有

import yaml
with open('an_empty_file.yml', 'r') as config_file:
    config=yaml.load(config_file)
    print(config) 
None

事实证明yaml.load(config_file)会返回一个NoneType对象,我认为这是有道理的。有一种简单的方法可以返回一个空字典吗?

2 个答案:

答案 0 :(得分:6)

如果它返回None,您可以使用or,这样如果yaml.load返回None,您的配置将默认保留一个空字典:

config = yaml.load(config_file) or {}

最终,这里发生的事情从左侧开始:

我们现在正在为config分配一个值。我们声明要将yaml.load(config_file)分配给配置,但是,通过使用or,我们在此声明中说的是,如果它(yaml.load)计算为None或False条件(即在本例中对我们来说,无),然后我们将{}分配给配置。

快速演示将空字符串作为config_file:

>>> import yaml
>>> config_file = ''
>>> config = yaml.load(config_file) or {}
>>> print(config)
{}

答案 1 :(得分:1)

在顶层,YAML文件可以有

  • 一个映射,由:分隔的键值对指示(可选择使用{}的流式样式),
  • -表示的序列,如果是块样式,[ ]如果是流式
  • 一个(单个)标量。

您的文件不是映射或序列,因此它是标量,因为具有空表示的标量被认为与指定

相同
null

在文件中。

要将其加载为空字典,而不是“无”,您可以执行以下操作:

with open('an_empty_file.yml', 'r') as config_file:
    config = yaml.load(config_file)
    config = {} if config is None else config
    print(config)

你应该从不尝试做一下简单的事情:

config = yaml.load(config_file) or {}

因为这也会导致具有单个标量0的文件:

0

使用单个标量浮点0.0

0.0

使用十六进制标量0x0

0x0

带有空双引号标量""

""

使用空单引号标量''

''

空折叠标量:

>

带有空的文字样式标量:

|

使用单个布尔False

False

no¹:

no

off¹:

off

以及空序列:

[

]

导致config成为空字典。

将错误地更改为空字典的不同文件内容的数量是无穷无尽的。

¹这是因为PyYAML从未在2009年发布的1.2标准中更新1.1。如果是,它也会转换0o0形式的八进制。