YAML 是一种数据序列化格式,用于人类的可读性和与脚本语言的交互,是一种被认为可以超越XML、JSON的配置文件。
YAML的基本知识
基本语法规则
- 大小写敏感
- 使用缩进表示层级关系。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 缩进时不允许使用Tab键,只允许使用空格
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
支持的数据结构
- 对象:键值对的集合,用英文冒号“:”表示,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)
- 数组(列表):一组按次序排列的值,前面加“-”,又称为序列(sequence) / 列表(list)
- 纯量(acalars):单个的、不可再分的值
- 字符串
- 布尔值
- 整数
- 浮点数
- null
- 时间
- 日期
pyyaml
需要自己安装pyyaml包:pip install pyyaml
使用时记得导入该包:import yaml
dump()
将Python对象转为yaml文档
格式:yaml.dump(data, stream=None, Dumper=Dumper, **kwds)
- data:需要转成yaml的数据
- stream:文件流
import yaml
data = {
"socres": {
"Chinese": 89,
"Math": 80
},
"parents": ["父亲", "母亲"],
"age": "15",
"height": 157.8,
"birthday": "2007-03-28",
"gender": None,
"name": "谢万青",
"graduated": True,
"other": False
}
with open("demo.yaml", "w", encoding="utf-8") as f:
yaml.dump(data, f)
新生成的demo.yaml文件内容如下:
age: '15'
birthday: '2007-03-28'
gender: null
graduated: true
height: 157.8
name: "\u8C22\u4E07\u9752"
other: false
parents:
- "\u7236\u4EB2"
- "\u6BCD\u4EB2"
socres:
Chinese: 89
Math: 80
从执行结果来看,中文被转成Unicode了,可能不太方便查看,如果不想中文被转,可以加上allow_unicode参数
代码:
import yaml
data = {
"socres": {
"Chinese": 89,
"Math": 80
},
"parents": ["父亲", "母亲"],
"age": "15",
"height": 157.8,
"birthday": "2007-03-28",
"gender": None,
"name": "谢万青",
"graduated": True,
"other": False
}
with open("demo.yaml", "w", encoding="utf-8") as f:
yaml.dump(data, f, allow_unicode=True)
执行成功后demo.yaml的内容如下:
age: '15'
birthday: '2007-03-28'
gender: null
graduated: true
height: 157.8
name: 谢万青
other: false
parents:
- 父亲
- 母亲
socres:
Chinese: 89
Math: 80
safe_load()
读取yaml文件的内容,转成python对象
yaml配置文件demo.yaml的内容如下:
bool_value:
true_value: # 以下都是代表了bool值的真
'TRUE': TRUE
'true': true
'True': True
false_value: # 以下都是代表了bool值的假
'FALSE': FALSE
'false': false
'False': False
float_value:
- 3.14
- -45
int_value:
- 90
- -2
null_value:
symbol: ~ # ~表示null
'null': null
string:
-
- 中文
- '哈哈' # 可以使用双引号或但你引号包裹字符
-
- English
- "eng"
date: 2018-02-17 # 日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00 #时间使用yyyy-MM-dd格式,时间和日期之间使用T连接,最后使用+代表时区
执行代码:
import yaml
with open("demo.yaml", "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
print(type(data))
print(data)
控制台输出结果为:
<class 'dict'>
{'bool_value': {'true_value': {'TRUE': True, 'true': True, 'True': True}, 'false_value': {'FALSE': False, 'false': False, 'False': False}}, 'float_value': [3.14, -45], 'int_value': [90, -2], 'null_value': {'symbol': None, 'null': None}, 'string': [['中文', '哈哈'], ['English', 'eng']], 'date': datetime.date(2018, 2, 17), 'datetime': datetime.datetime(2018, 2, 17, 15, 2, 31, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))}