YAML 是一种数据序列化格式,用于人类的可读性和与脚本语言的交互,是一种被认为可以超越XML、JSON的配置文件。
需要自己安装pyyaml包:pip install pyyaml
使用时记得导入该包:import yaml
将Python对象转为yaml文档
格式:yaml.dump(data, stream=None, Dumper=Dumper, **kwds)
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
读取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)))}