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

当YAML文件为空时加载空字典(Python 3.4),python,dictionary,yaml,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\u文件)将返回一个NoneType对象,我认为这是有意义的。有没有简单的方法可以返回一个空字典?如果它返回None,您可以只使用或,

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

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

结果是
yaml.load(config\u文件)
将返回一个
NoneType
对象,我认为这是有意义的。有没有简单的方法可以返回一个空字典?

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

config = yaml.load(config_file) or {}
最终,这里发生的事情从左手边开始:

我们现在正在为config分配一个值。我们声明将
yaml.load(config_file)
分配到config中,但是,通过使用
,我们在该语句中所说的是,如果(
yaml.load
)的计算结果为无或假条件(即,在本例中,我们为无),那么我们将
{}
分配到config中

将空字符串作为配置文件的快速演示:

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

在顶层,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
imk_:

no
off
off
ª:

no
off
以及空序列:

[

]
使
config
成为空字典

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



这是因为PyYAML从未将1.1更新为2009年发布的1.2标准。如果是的话,它还可以转换形式为
0o0

的八进制,谢谢您的帮助!它确实解决了问题,但我有点困惑。我熟悉
作为布尔运算符的用法,但我不太明白它为什么在这里工作。我很乐意解释一下。更新答案。很有趣。所以
None
False
是相同/相似的吗?@Vincent。这是我们必须小心的地方。它们根本不一样,但它们的评估结果是相同的错误条件。如果执行
If None==False:print('stuff')
。你不会看到东西。如果无错误,甚至
:打印('asdf')
asdf'将不会被输出。