layout: post title: “配置文件yaml编写规则” date: 2021-10- 26 description: “yaml是一个专门用来写配置文件的语言”
yaml文件规则
-
区分大小写;
-
使用缩进表示层级关系,使用空格键缩进,而非Tab键缩进
-
缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
-
文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
-
注释标识为#
yaml文件数据结构
- 对象:键值对的集合(简称 “映射或字典”)
-
键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
-
数组:一组按序排列的值(简称 “序列或列表”)
-
数组前加有 “-” 符号,符号与值之间需用空格分隔
-
纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
- None值可用null,或 ~ 表示
python读取yaml配置文件
- 前提条件
- python中读取yaml文件前需要安装pyyaml和导入yaml模块:
-
读取yaml文件数据
python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
import yaml import os def get_yaml_data(yaml_file): # 打开yaml文件 print("***获取yaml文件数据***") with open(yaml_file, 'r', encoding="utf-8") as file: file_data = file.read() # 将字符串转化为字典或列表 print("***转化yaml数据为字典或列表***") data = yaml.load(file_data) return data current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "config.yaml") get_yaml_data(yaml_path)
-
yaml文件数据字典层级格式
-
yaml文件中单层级:
# 获取yaml文件数据 # yaml键值对:即python中字典 usr: my psw: 123455 # python解析yaml文件后获取的数据 {'usr': 'my', 'psw': 123455}
-
yaml文件中嵌套多层:
# yaml键值对嵌套:即python中字典嵌套字典 usr1: name: a psw: 123 usr2: name: b psw: 456 # python解析yaml文件后获取的数据: {'usr1': {'name': 'a', 'psw': 123}, 'usr2': {'name': 'b', 'psw': 456}}
-
yaml文件中“键值对”中嵌套“数组”
# yaml键值对中嵌套数组 usr3: - a - b - c usr4: - b # python解析yaml文件后获取的数据: {'usr3': ['a', 'b', 'c'], 'usr4': ['b']}
-
-
yaml文件数据为数组
-
yaml文件中内容为数组
# yaml数组 - a - b - 5 # python解析yaml文件后获取的数据: ['a', 'b', 5]
-
yaml文件“数组”中嵌套“键值对”
# yaml"数组"中嵌套"键值对" - usr1: aaa - psw1: 111 usr2: bbb psw2: 222 # python解析yaml文件后获取的数据: [{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]
-
-
yaml文件中基本数据类型:
-
纯量
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)}
-
-
yaml文件中引用
# yaml文件中内容 animal3: &animal3 fish test: *animal3 # python读取的数据 {'animal3': 'fish', 'test': 'fish'}
python对象生成yaml文档
-
直接导入yaml(即import yaml)生成的yaml文档
通过yaml.dump()方法不会将列表或字典数据进行转化yaml标准模式,只会将数据生成到yaml文档中
# 将python对象生成yaml文档 import yaml def generate_yaml_doc(yaml_file): py_object = {'school': 'zhang', 'students': ['a', 'b']} with open(yaml_file, 'w', encoding='utf-8') as file: yaml.dump(py_object, file) current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "generate.yaml") generate_yaml_doc(yaml_path) # 结果 school: zhang students: [a, b]
-
使用ruamel模块中的yaml方法生成标准的yaml文档
-
使用ruamel模块中yaml前提条件
-
ruamel模块生成yaml文档
def generate_yaml_doc_ruamel(yaml_file): from ruamel import yaml py_object = {'school': 'zhang', 'students': ['a', 'b']} with open(yaml_file, 'w', encoding='utf-8') as file: yaml.dump(py_object, file, Dumper=yaml.RoundTripDumper) current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "generate.yaml") generate_yaml_doc_ruamel(yaml_path) # 结果 school: zhang students: - a - b
-
ruamel模块读取yaml文档
# 通过from ruamel import yaml读取yaml文件 def get_yaml_data_ruamel(yaml_file): from ruamel import yaml with open(yaml_file, 'r', encoding='utf-8') as file: data = yaml.load(file.read(), Loader=yaml.Loader) current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "dict_config.yaml") get_yaml_data_ruamel(yaml_path)
-
示例
-
编写yaml配置文件
name: junxi age: 18 spouse: name: Rui age: 18 children: - name: Chen You age: 3 - name: Ruo Xi age: 2
-
解析yaml配置文件
import yaml with open('yaml_example.yaml') as f: content = yaml.load(f) print('before modification:', content) content['age'] = 17 content['children'][1]['age'] = 1 print('after modification', content)
-
结果
('before modification:', {'age': 18, 'spouse': {'age': 18, 'name': 'Rui'}, 'name': 'junxi', 'children': [{'age': 3, 'name': 'Chen You'}, {'age': 2, 'name': 'Ruo Xi'}]}) ('after modification', {'age': 17, 'spouse': {'age': 18, 'name': 'Rui'}, 'name': 'junxi', 'children': [{'age': 3, 'name': 'Chen You'}, {'age': 1, 'name': 'Ruo Xi'}]})