我有一个空的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
对象,我认为这是有道理的。有一种简单的方法可以返回一个空字典吗?
答案 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
形式的八进制。