yaml学习
配置(Yet Another Markup Language)(发音 /ˈjæməl/ )
1. yaml文件规则
1、区分大小写;
2、使用缩进表示层级关系;
3、使用空格键缩进,而非Tab键缩进
4、缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
5、文件中的字符串不需要使用引号标注,但若字符串包含
有特殊字符则需用引号标注;
6、注释标识为 #
2. 使用前提
1、pip3 install pyyaml
2、import yaml
3.Python 使用
1、读取文件数据
rf = open(yaml_file_path)
dict_datas = yaml.load(rf) # 将数据转化为列表或者字典
2、yaml文件中基本数据类型
# 实例(中间一定要用空格隔开) 对应的类似Python字典格式
s_val: name # 字符串:{'s_val': 'name'}
spec_s_val: "name\n" # 特殊字符串:{'spec_s_val': 'name\n'
num_val: 31.14 # 数字:{'num_val': 31.14}
bol_val: true # 布尔值:{'bol_val': True}
nul_val: null # null值:{'nul_val': None}
nul_val1: ~ # null值:{'nul_val1': None}
time_val: 2018-03-01t11:33:22.55-06:00
# 时间值:{'time_val': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)}
date_val: 2019-01-10
# 日期值:{'date_val': datetime.date(2019, 1, 10)}
3、嵌套数组
# {"test": [1, 2]}
test:
- 1
- 2
# test2 = [{"host": "host1", "port": "port1"}, {"host": "host2", "port": "port2"}, {"host": "host3", "port": "port3"}]
test2:
-
host: host1
port: port1
-
host: host2
port: port2
-
host: host3
port: port3
4、锚点和应用
# & 表示将localhost1作为localhost的别名
# << 表示将*localhost1代表的map合并入当前map数据
# test2 = [{"host": "127.0.0.1", "port": 3306, "db": "db1"}, {"host": "127.0.0.1", "port": 3306, "db": "db2"}, {"host": "127.0.0.1", "port": 3306, "db": "db3"}]
host: &host
host: 127.0.0.1
post: 3306
test3:
-
<<: *host
db: db1
-
<<: *host
db: db2
-
<<: *host
db: db3
4、多个yaml文档和生成yaml
1、多个文档在一个yaml文件,使用 (— 换行)分隔方式来分段;读取时:用yaml.load_all()
import yaml
with open('test.yaml', 'r') as rf:
datas = yaml.load_all(rf) # datas 是迭代器
for data in datas:
print data, type(data)
2、yaml库 将数据生成到yaml文档中
with open('test.yaml', 'r') as rf:
datas = yaml.load(rf)
with open('test_generate_yaml.yaml', 'w') as af:
yaml.dump(datas, af)
3、生成的yaml文档不太友好,虽然也都能查到数据。现用 ruamel库 将数据生成标准的yaml文档
# 安装 pip install ruamel.yaml
# 需要加个参数:Dumper=yaml.RoundTripDumper
from ruamel import yaml
data_dict = {'test': [{'1': '1'}, {'2': 2}]}
file = "ruamel_generate_file.yaml"
with open(file, 'w') as wf:
yaml.dump(data_dict, wf, Dumper=yaml.RoundTripDumper)
# 同样也能读取,加参数:Loader=yaml.Loader
from ruamel import yaml
file = "ruamel_generate_file.yaml"
with open(file, 'r') as rf:
print(yaml.load(rf, Loader=yaml.Loader))