三方库:ruamel.yaml
1、PyYAML库安装
PyYAML为python解析yaml的库
安装:pip3 install -U PyYAML
2、语法规则
1.大小写敏感
2.使用缩进表示层级关系
3.缩进时不允许使用Tab键,只允许使用空格。
4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
3、支持的数据结构
1.对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
2.数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
3.纯量(scalars):单个的、不可再分的值
值为字符串
animal: pets
转换为python代码
{'animal': 'pets'}
值为字典
animal: {"ke1":"pets","key2":"app"} # python字典
转换为python代码
{animal: {"ke1":"pets","key2":"app"}} # 嵌套字典结构
数组
方式一
animal:
- data1
- data2
转换为python代码
{'animal': ['data1', 'data2']}
方式二
animal: ['data1', 'data2'] # python列表
转换为python代码
{'animal': ['data1', 'data2']} # 字典嵌套列表
纯量(包含:字符串,布尔值,整数,浮点数,Null,日期)
字符串
value: "hello"
转换为python代码
{"value":"hello"}
布尔值
value1: true
value2: false
转换为python代码
{'value1': True, 'value2': False}
整数,浮点数
value1: 12
value2: 12.102
转换为python代码
{'value1': 12, 'value2': 12.102}
空(Null)
value1: ~ # ~ 表示为空,None
转换为python代码
{'value1': None}
日期
value1: 2017-10-11 15:12:12
转换为python代码
{'languages': {'value1': datetime.datetime(2017, 10, 11, 15, 12, 12)}}
类型转换
使用!!str, !!float等可以将默认类型转为指定类型,如:
- !!float 3
- !!str 4
- !!str true
对应JSON格式
[
3.0,
"4",
"true"
]
多行文本及拼接
| 保留多行文本(保留换行符)
> 将多行拼接为一行
示例:
a: |
我
喜欢你
b: >
我
不喜欢你
才怪
对应JSON格式:
{
"a": "我\n喜欢你\n",
"b": "我 不喜欢你 才怪"
}
锚点&和引用*
锚点:标注一个内容,锚点名称自定义
引用:使用被标注的内容<<: *锚点名
例子:
data: &imp
value: 456
name:
value1: 123
<<: *imp # "<<:" 表示合并到当前位置, "*imp" 表示引用锚点imp
转换为python代码
{'data': {'value': 456}, 'name': {'value': 456, 'value1': 123}}
案例1:读yaml文件
yaml文件内容
Search_Data:
search_test_001:
value: 456
expect: [4,5,6]
search_test_002:
value: "你好"
expect: {"value":"你好"}
读取yaml文件
方法:yaml.load(stream, Loader=Loader)
参数:
stream:待读取文件对象
示例:
import yaml
with open("../Data/search_page.yaml",'r') as f:
data = yaml.load(f)
print(type(data)) # 打印data类型
print(data) # 打印data返回值
执行结果:
<class 'dict'>
{'Search_Data': {
'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'},
'search_test_001': {'expect': [4, 5, 6], 'value': 456}
}
}
案例2:写入yaml
写入yaml文件内容
{'Search_Data':
{
'search_test_002':
{
'expect':
{'value': '你好'}, 'value': '你好'},
'search_test_001':
{'expect': [4, 5, 6], 'value': 456}
}
}
写yaml文件
方法:yaml.dump(data,stream,**kwds)
参数:
data:写入数据类型为字典
stream:打开文件对象
encoding='utf-8' # 设置写入编码格式
allow_unicode=True # 是否允许unicode编码
写入示例1:不设置编码格式
import yaml
data = {'Search_Data': {
'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'},
'search_test_001': {'expect': [4, 5, 6], 'value': 456}}}
with open("./text.yaml","w") as f: # 在当前目录下生成text.yaml文件,若文件存在直接更新内容
yaml.dump(data,f)
执行结果:
1.当前目录生成text.yaml文件
2.文件内容:
Search_Data:
search_test_001:
expect: [4, 5, 6]
value: 456
search_test_002:
expect: {value: "\u4F60\u597D"} # 中文出现乱码
value: "\u4F60\u597D" # 中文出现乱码
写入示例2:设置编码格式
import yaml
data = {'Search_Data': {
'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'},
'search_test_001': {'expect': [4, 5, 6], 'value': 456}}}
with open("./text.yaml","w") as f: # 在当前目录下生成text.yaml文件,若文件存在直接更新内容
yaml.dump(data,f,encoding='utf-8',allow_unicode=True)
执行结果:
1.当前目录生成text.yaml文件
2.文件内容:
Search_Data:
search_test_001:
expect: [4, 5, 6]
value: 456
search_test_002:
expect: {value: 你好} # 中文未出现乱码
value: 你好 # 中文未出现乱码