1 yaml文件说明
1.1 yaml文件规则
- 区分大小写; 使用缩进表示层级关系;
- 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
- 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
- 注释标识为 #
- 多个文档在一个yaml文件,使用 - - - (中间不要空格)分隔方式来分段
1.2 yaml文件数据结构
- 对象:键值对的集合(简称 “映射或字典”)
键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔 - 数组:一组按序排列的值(简称"序列或列表")
数组前加有 “-” 符号,符号与值之间需用空格分隔 - 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
None值可用null可 ~表示
2 pyyaml常用函数
(1)yaml.load()
该函数解析流中的第一个YAML 文档,并生成相应的 Python 对象。
(a)键值对集合转化为python的字典对象
yaml文件格式如下:
key1:
key2: value1
转化为python的字典对象,格式如下:
{'key1': {'key2': 'value1'}}
(b)序列/列表转化为python的列表对象
yaml文件格式如:
- 1
- 2
- 3
- 4
转化为python的列表对象,格式如下:
[1,2,3,4]
(c)空yaml文件转化为python的None
yaml文件格式如:
#为空的yaml文件
转化为python的None,格式如下:
None
(d)整数转化为python的int对象,其他字符串、bool值、整数、浮点数、日期时间、日期等同数值类似
yaml文件格式如:
1
转化为python的int对象,格式如下:
1
(2)yaml.dump()
该函数将python对象序列化为YAML 流,如果流为 None,则改为返回生成的字符串。
(3)yaml.load_all()
解析流中的所有 YAML 文档并生成相应的 Python 对象。
yaml文件格式如:
animal1: dog
age: 2
---
animal2: cat
age: 3
利用python可对每个yaml文档生成相应的python对象
file=open('test.yaml','r')
dict = yaml.load_all(file.read(),Loader=yaml.FullLoader)
for key in dict:
print(key)
#输出内容如下:
{'animal1': 'dog', 'age': 2}
{'animal2': 'cat', 'age': 3}
(4)yaml.dump_all()
python代码如下所示:
file = open('test.yaml','w')
param = {
'key1':{
'key2':'12'
},
'key3':[1,2,3,4,5,6]
}
param1={
'key4':444
}
yaml.dump_all([param,param1],file)
转化的yaml文件格式为:
key1:
key2: '12'
key3:
- 1
- 2
- 3
- 4
- 5
- 6
---
key4: 444
注:1)在yaml.dump()和yaml.dump_all()函数中添加file文件,则可直接将内容写入文件中,格式如:yaml.dump_all(params,file)
2)yaml.dump_all()函数中若需要在一个文件中写入多个yaml文件,则参数可用列表表示,格式如:yaml.dump_all([param,param1],file)
3 常见问题
(1)使用yaml.load()时报错 TypeError: load() missing 1 required positional argument: ‘Loader’
记录原因:
YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,该load函数也变得更加安全
用以下方式都可以解决上述问题
d1=yaml.load(file,Loader=yaml.FullLoader)
d1=yaml.safe_load(file)
d1 = yaml.load(file, Loader=yaml.CLoader)