原文链接:http://www.zengyuetian.com/?p=2659
关于yaml
- YAML语言的设计目标,就是方便人类读写。如果你想要实现一些用ini不好做到的配置,可以使用yaml格式作为配置文件
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
yaml数据结构
-
- YAML 支持的数据结构有三种。
- 对象
- 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 对象的一组键值对,使用冒号结构表示。
-
- 数组
- 一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 一组连词线开头的行,构成一个数组。
-
- 纯量(scalars)
- 单个的、不可再分的值
- 包括字符串,布尔值,整数,浮点数,Null,时间,日期
一个yaml文件
name: John Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age: 12
和它对应的json文件如下:
{ name: 'John Smith',
age: 37,
spouse: { name: 'Jane Smith', age: 25 },
children:
[ { name: 'Jimmy Smith', age: 15 },
{ name: 'Jenny Smith', age: 12 } ]
}
读写yaml文件
import yaml
if __name__ == "__main__":
with open('father.yml') as f:
content = yaml.load(f)
# output: <type 'dict'>
print(type(content))
print(content)
content.update({'age': 38})
print(content)
with open('PyYAML.yml', 'w') as nf:
yaml.dump(content, nf)
生成的新yaml文件形式如下:
age: 38
children:
- {age: 15, name: Jimmy Smith}
- {age: 12, name: Jenny Smith}
name: John Smith
spouse: {age: 25, name: Jane Smith}
仔细一看,跟原yaml文件不像嘛,尤其是几个大括号,很刺眼,这可怎么办?
使用ruamel.yaml代替PyYAML
- 解决方法就是使用ruamel.yaml代替PyYAML,因为PyYAML貌似已经不再维护了
- 安装:pip install ruamel.yaml
- 使用ruamel.yaml库里面函数参数Loader=ruamel.yaml.RoundTripLoader和Dumper=ruamel.yaml.RoundTripDumper可以用来保持新生成的yaml文件的表现和输入文件一致。代码如下:
from ruamel import yaml
if __name__ == "__main__":
with open('father.yml') as f:
content = yaml.load(f, Loader=yaml.RoundTripLoader)
# output: <type 'dict'>
print(type(content))
print(content)
content.update({'age': 38})
print(content)
with open('ruamel.yml', 'w') as nf:
yaml.dump(content, nf, Dumper=yaml.RoundTripDumper)
生成新的yaml文件形式如下,正是我们期望的格式:
name: John Smith
age: 38
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age: 12