YAML 简介
YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。
yaml是专门用来写配置文件的语言 yaml文件其实也是一种配置文件类型,后缀名是.yaml 或 .yml都可以
yaml的语法规则
区分大小写
使用缩进表示层级关系
使用空格缩进,而非Tab键缩进
缩进的空格数目不固定,只需要相同层级的元素左侧对齐
文件中的字符串不需要引号标注,但若字符串中包含有特殊字符则需用引号标注
多组数据之间使用3横杠—分割
注释标识为
#
(但不能在一段代码的行末尾加 # 注释,否则会报错)
yaml文件数据结构
对象:键值对的集合(简称:"映射或字典") 键值对用冒号
:
结构来表示,冒号与值之间需用空格分隔数组: 一组按序排列的值(简称"序列或表") 数组前加有
-
符号,符号与值之间需用空格分隔纯量(scalars): 单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等) None值可用
null
或~
表示
yaml示例(test.yaml)
# 字典 用冒号加空格连接键和值( : )
name: 张三
age: 20
---
# 列表 短横线加一个空格(- )
- 10
- 20
- 30
# 当一个yaml文件内有多组数据时,用3个-分隔
---
# 列表中的字典
-
name: 张三
age: 21
-
A: apple
---
# 字典中的字典
name:
name1: 张三
---
# 字典中的列表
name:
- 张三
- 李四
- 王五
age: 20
---
# 元组(使用!!对数据类型进行转换,tuple由list转换而来)
!!python/tuple
- Android
- 10
- null
- ~
- True
---
# 纯量(scalars)
str: "Hello World!"
int: 110
float: 3.141
# true or false
boolean: true
# 也可以用 ~ 号来表示 null
None: null
time: 2016-09-22t11:43:30.20+08:00
date: 2016-09-22
安装yaml库
pip install pyyaml
# 指定镜像源
pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple
读取与写入
load,safe_load(读取文档)
import yaml
with open('test.yaml','r', encoding='utf-8') as f:
# data = yaml.load(f.read(), Loader=yaml.FullLoader)
# print(data)
data = yaml.safe_load(f.read(), Loader=yaml.FullLoader) # 官方推荐(安全)
print(data)
load_all,safe_load_all(读取多个文档)
with open('test.yaml','r', encoding='utf-8') as f:
# docs = yaml.load_all(f.read(), Loader=yaml.FullLoader)
docs = yaml.safe_load_all(f.read(), Loader=yaml.FullLoader) # 官方推荐(安全)
for doc in docs:
for i, j in doc.items():
print(i, ":", j)
注:safe_load()(安全解析函数,解析yaml防止yaml文件中包含恶意代码)
dump,safe_dump(单数据写入文档)
import yaml
users = [{'name': '张三', 'age': 18},
{'name': '李四', 'age': 20}]
with open('test.yaml', 'w', encoding='utf-8') as f:
# allow_unicode=True参数防止写入的中文乱码
# yaml.dump(data=users, stream=f, ,allow_unicode=True)
yaml.safe_dump(data=users, stream=f, ,allow_unicode=True) # 官方推荐(安全)
dump_all,safe_dump_all(多数据写入文档)
Data1 = {
"page": 1,
"msg": "msg",
"data": [1,2],
}
Data2 = {
"page": 1,
"msg": "msg",
"data": [1,2],
}
with open('test.yml', 'w', encoding='utf-8') as f:
# allow_unicode=True参数防止写入的中文乱码
# yaml.dump_all(documents=[Data1, Data2], stream=f, allow_unicode=True)
yaml.safe_dump_all(documents=[Data1, Data2], stream=f, allow_unicode=True)
dump(sort_keys排序键)
import yaml
with open('test.yaml',"w",encoding="utf-8") as f:
data = yaml.load(f, Loader=yaml.FullLoader)
print(data)
# sort_keys=False,是yaml格式保持原来的排序(默认按照字母排序)
sorted = yaml.dump(data, sort_keys=False)
sorted = yaml.safe_dump(data, sort_keys=False)
print(sorted)