详解Python yaml模块
一、yaml文件介绍
yaml是一个专门用来写配置文件的语言。
1.yaml文件规则
- 区分大小写;
- 使用缩进表示层级关系;
- 使用空格键缩进,而非Tab键缩进
- 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
- 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
- 注释标识为#
2.yaml文件数据结构
- 对象:键值对的集合(简称"映射或字典")
键值对用冒号“:”结构表示,冒号与值之间需用空格分隔
- 数组:一组按序排列的值(简称"序列或列表")
数组前加有“-”符号,符号与值之间需用空格分隔
- 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
None值可用null可~表示
二、python中读取yaml配置文件
1.前提条件
python中读取yaml文件前需要安装pyyaml和导入yaml模块:
- 使用yaml需要安装的模块为pyyaml(pip3installpyyaml);
- 导入的模块为yaml(importyaml)
2.读取yaml文件数据
python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
importyaml
importos
defget_yaml_data(yaml_file):
#打开yaml文件
print("***获取yaml文件数据***")
file=open(yaml_file,'r',encoding="utf-8")
file_data=file.read()
file.close()
print(file_data)
print("类型:",type(file_data))
#将字符串转化为字典或列表
print("***转化yaml数据为字典或列表***")
data=yaml.load(file_data)
print(data)
print("类型:",type(data))
returndata
current_path=os.path.abspath(".")
yaml_path=os.path.join(current_path,"config.yaml")
get_yaml_data(yaml_path)
"""
***获取yaml文件数据***
#yaml键值对:即python中字典
usr:my
psw:123455
类型:
***转化yaml数据为字典或列表***
{'usr':'my','psw':123455}
类型:
"""
3.yaml文件数据为键值对
(1)yaml文件中内容为键值对:
#yaml键值对:即python中字典 usr:my psw:123455 s:"abc\n"
python解析yaml文件后获取的数据:
{'usr':'my','psw':123455,'s':'abc\n'}
(2)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}}
(3)yaml文件中“键值对”中嵌套“数组”
python解析yaml文件后获取的数据:
#yaml键值对中嵌套数组 usr3: -a -b -c usr4: -b
python解析yaml文件后获取的数据:
{'usr3':['a','b','c'],'usr4':['b']}
4.yaml文件数据为数组
(1)yaml文件中内容为数组
#yaml数组 -a -b -5
python解析yaml文件后获取的数据:
['a','b',5]
(2)yaml文件“数组”中嵌套“键值对”
#yaml"数组"中嵌套"键值对" -usr1:aaa -psw1:111 usr2:bbb psw2:222
python解析yaml文件后获取的数据:
[{'usr1':'aaa'},{'psw1':111,'usr2':'bbb','psw2':222}]
5.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)}
6.yaml文件中引用
yaml文件中内容
animal3:&animal3fish test:*animal3
python读取的数据
{'animal3':'fish','test':'fish'}
三、python中读取多个yaml文档
1.多个文档在一个yaml文件,使用---分隔方式来分段
如:yaml文件中数据
#分段yaml文件中多个文档 --- animal1:dog age:2 --- animal2:cat age:3
2.python脚本读取一个yaml文件中多个文档方法
python获取yaml数据时需使用load_all函数来解析全部的文档,再从中读取对象中的数据
#yaml文件中含有多个文档时,分别获取文档中数据
defget_yaml_load_all(yaml_file):
#打开yaml文件
file=open(yaml_file,'r',encoding="utf-8")
file_data=file.read()
file.close()
all_data=yaml.load_all(file_data)
fordatainall_data:
print(data)
current_path=os.path.abspath(".")
yaml_path=os.path.join(current_path,"config.yaml")
get_yaml_load_all(yaml_path)
"""结果
{'animal1':'dog','age':2}
{'animal2':'cat','age':3}
"""
四、python对象生成yaml文档
1.直接导入yaml(即importyaml)生成的yaml文档
通过yaml.dump()方法不会将列表或字典数据进行转化yaml标准模式,只会将数据生成到yaml文档中
#将python对象生成yaml文档
importyaml
defgenerate_yaml_doc(yaml_file):
py_object={'school':'zhang',
'students':['a','b']}
file=open(yaml_file,'w',encoding='utf-8')
yaml.dump(py_object,file)
file.close()
current_path=os.path.abspath(".")
yaml_path=os.path.join(current_path,"generate.yaml")
generate_yaml_doc(yaml_path)
"""结果
school:zhang
students:[a,b]
"""
2.使用ruamel模块中的yaml方法生成标准的yaml文档
(1)使用ruamel模块中yaml前提条件
- 使用yaml需要安装的模块:ruamel.yaml(pip3installruamel.yaml);
- 导入的模块:fromruamelimportyaml
(2)ruamel模块生成yaml文档
defgenerate_yaml_doc_ruamel(yaml_file):
fromruamelimportyaml
py_object={'school':'zhang',
'students':['a','b']}
file=open(yaml_file,'w',encoding='utf-8')
yaml.dump(py_object,file,Dumper=yaml.RoundTripDumper)
file.close()
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
"""
(3)ruamel模块读取yaml文档
#通过fromruamelimportyaml读取yaml文件
defget_yaml_data_ruamel(yaml_file):
fromruamelimportyaml
file=open(yaml_file,'r',encoding='utf-8')
data=yaml.load(file.read(),Loader=yaml.Loader)
file.close()
print(data)
current_path=os.path.abspath(".")
yaml_path=os.path.join(current_path,"dict_config.yaml")
get_yaml_data_ruamel(yaml_path)
以上就是详解Pythonyaml模块的详细内容,更多关于Pythonyaml模块的资料请关注毛票票其它相关文章!