点击上方👆🏻【东风大蘑菇】关注我
目录:
一、简介
1、什么是YAML?
2、YAML的常用场景
3、YAML的规则
二、Python读写YAML数据
1、安装PyYAML
2、读取YAML数据
3、写入YAML数据
三、YAML的使用
1、YAML对象
2、YAML数组
3、对象、数组结合应用
4、YAML纯量
5、YAML的字符串
6、引用写法
7、YAML文本格式化
01
1、什么是YAML?
YAML 是一种数据序列化语言,全称:YAML Ain't Markup Language(YAML 不是标记语言)。“YAML” 正是这句话的递归缩写,强调了 YAML 是用于数据而不是文档。YAML 还是 JSON 的超集,所以 JSON 语法在 YAML 语言中有效。
2、YAML的常用场景
- 数据的构造、存储;
- 配置文件管理;
3、YAML的规则
基本语法规则如下:
1、大小写敏感;
2、使用缩进表示层级关系;
3、缩进时不允许使用Tab键,只允许使用空格;
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
YAML 支持的数据结构有三种。
1、对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
2、数组:一组按顺序排列的值,又称为序列(sequence) / 列表(list)
3、纯量(scalars):单个的、不可再分的值
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML文件的后缀是
:yaml 或 yml。
02
注意📢:本篇文章,主要是讲解如何利用Python代码,对YAML数据进行读写操作。如果读者使用其他代码,请自行查阅相关资料。
1、安装PyYAML
先决条件:尽量使用Python3.7及以上版本。
安装 yaml 模块:pip install PyYAML
。
校验 PyYAML 是否安装成功:pip list
在控制台的输出中,能找到 PyYAML,说明已经安装成功。
2、读取YAML数据
先决条件:
1、新建一个名为 test.yaml 的文件。(可新建一个 txt 文件,然后把txt后缀改成 yaml 或 yml)
2、新建一个名为 test.py 的文件。
后续的教程中,数据默认写入 test.yaml 文件,代码默认写入 test.py 文件。
第一步
:在 test.yaml 中写入数据:
test: test
第二步
:在 test.py 中写入如下代码:
# 引入YAML处理模块:yaml
import yaml
# 打开yaml文件,路径要写对,不然会报错
# ~/SimpleAPI/Data...这是作者的test.yaml文件路径,请修改为自己的test.yaml路径再运行代码
with open("~/SimpleAPI/Data/haloLogin/test.yaml", "r", encoding="utf-8") as f:
# yaml.safe_load:读取 YAML 数据的方法
data = yaml.safe_load(f.read())
f.close()
print(data)
print(type(data))
第三步
:cmd 执行 test.py 的代码。
执行完成后,控制台会输出以下内容:
{'test': 'test'}
<class 'dict'>
现在你还不需要理解输出内容的含义,你只要知道,按照这个方法,我们已经读取到数据了,并且,读取到的这些数据,Python是可以处理的。
3、写入YAML数据
第一步
:在 test.py 中写入以下代码:
import yaml
# 准备点数据,把这些数据写到test.yaml
data = [1, 2, 3, 4, [5, 6, "写入数据"]]
with open("~/SimpleAPI/Data/haloLogin/test.yaml", "w", encoding="utf-8") as f:
# yaml.safe_dump:将数据写入 YAML 文件的方法
# default_flow_style:数据写入文本后的样式,默认为False
# default_flow_style-False:写入YAML文本后,会转换成YAML格式
# default_flow_style-True:写入YAML文本后,不转换格式,该什么样就什么样
# allow_unicode:处理中文乱码问题
yaml.safe_dump(data, f, default_flow_style=False, allow_unicode=True)
f.close()
第二步
:cmd 执行 test.py 的代码。
代码执行完成后,控制台不会有任何输出。
第三步
:打开 test.yaml 文件,查看数据是否写入。
如果写入成功,test.yaml 文件的数据格式会如下显示:
- 1
- 2
- 3
- 4
- - 5
- 6
- 写入数据
03
上面已经详细说明了Python对于YAML文件的读、写操作,下面我们来学习下YAML数据的编辑格式。
PS
:以下教程操作,大多数是读取YAML文本数据操作。如果想要看到YAML数据转换成Python数据后的效果,请使用读取YAML数据的代码,然后打印查看。
1、YAML对象
YAML对象在Python中,对应的是字典。对于初学者,写YAML对象的时候,当成Python字典的一种另类写法就行了。
对象的一组键值对,使用冒号结构表示。
key: value
转为 Python 如下。
{"key": "value"}
我们在简介中说过,YAML是JSON的超集,所以亦可以在YAML文件中写入JSON格式的数据。
{"key": "value"}
转为 Python 如下。
{"key": "value"}
甚至还能YAML结合JSON一起使用。
key: {"key_1": "value_1"}
转为 Python 如下。
{'key': {'key_1': 'value_1'}}
心细的同学,应该有注意到,YAML的key值、value值并没有使用引号
。这就是YAML语言简洁好用的其中一个点,对于String类型的数据,我们并不需要刻意的使用引号引起来。
2、YAML数组
YAML的数组,对应Python的列表。
一组连词线开头的行,构成一个数组。
- 吃饭
- 睡觉
- 打豆豆
转为 Python 如下。
['吃饭', '睡觉', '打豆豆']
如果你想实现嵌套列表,那可以在下一层缩进一个空格。
- # 第一层
- 吃饭
- 睡觉
- 打豆豆
# 没写注释的,全是第二层
- # 第一层
- 吃饭
- 睡觉
- 打豆豆
转为 Python 如下。
[['吃饭', '睡觉', '打豆豆'], ['吃饭', '睡觉', '打豆豆']]
Python的yaml.safe_load方法,在读取数据的时候,会自动剔除#
的注释内容。
3、对象、数组、JSON结合应用
除了上面的简单操作,我们可以将数组、对象、JSON这三者一起结合使用。
案例。
key_1:
- {"JSON_key_1": value_1}
- {"JSON_key_2": value_2}
key_2: [1, 2, 3, "中文"]
转为 Python 如下。
{
'key_1': [
{'JSON_key_1': 'value_1'},
{'JSON_key_2': 'value_2'}
],
'key_2': [1, 2, 3, '中文']
}
注意📢:数组、对象确实可以结合使用,但是最顶层的数据结构,必须只能是同一个数据结构。例如案例
中的"key_1" 和 "key_2",这两个都属于对象,如果一个是对象,另一个数组,那就报错。
错误案例。
key_1:
- {"JSON_key_1": value_1}
- {"JSON_key_2": value_2}
- key_2: [1, 2, 3, "中文"]
Python报错信息。
yaml.parser.ParserError: while parsing a block mapping
in "<unicode string>", line 1, column 1:
key_1:
^
expected <block end>, but found '-'
in "<unicode string>", line 5, column 1:
- key_2: [1, 2, 3, "中文"]
^
4、YAML纯量
纯量:最基本的,不可再分的值。包括如下类型
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
浮点数、整数。
float: 1.1
int: 10
转为 Python 如下。
{'float': 1.1, 'int': 10}
布尔值。
bool_1: Ture # 开头不区分大小写,True 和 true 是一个意思
bool_2: false # 开头不区分大小写,False 和 false 是一个意思
转为 Python 如下。
{'bool_1': True, 'bool_2': False}
NULL。
null_type_1: null
# 可以用 ~ 代替 null
null_type_2: ~
转为 Python 如下。
{'null_type_1': None, 'null_type_2': None} # Python没有null类型,所以转换后变成None
时间。
时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
datetime: 2022-08-13T18:00:00+08:00
转为 Python 如下。
{'datetime': datetime.datetime(2022, 8, 13, 18, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))}
日期。
日期必须使用ISO 8601格式,即yyyy-MM-dd
date: 2022-08-13
转为 Python 如下。
{'date': datetime.date(2022, 8, 13)}
5、YAML的字符串
字符串是最麻烦,最复杂的一种数据类型。在YAML语言中,字符串也有一些特殊的规定。
1、字符串默认不用引号,但有特殊要求,也可以使用。
案例:int、bool转字符串。
int_str: "2000" # 将int类型转为String类型
bool_str: "True" # 将bool类型转为String类型
转为 Python 如下。
{'int_str': '2000', 'bool_str': 'True'}
2、如果字符串之中包含空格或特殊字符,需要放在引号之中。
案例。
str: '键: 值'
转为 Python 如下。
{'str': '键: 值'}
3、用单引号或双引号都没问题,但双引号不会对特殊字符转义。
制表符案例。
str_1: 't开头缩进' # 原格式输出,t就是一个字符串,不会变成制表符
str_2: "t开头缩进" # 带有制表符的字符串
转为 Python 如下。
{'str_1': '\t开头缩进', 'str_2': 't开头缩进'}
Python 输出效果如下。
4、如果字符串中有引号,那最好不要用引号把字符串引起来,我们让Python自己处理。
案例
str_1: it's an apple
str_2: it"s an apple
Python 输出效果如下。
{'str_1': "it's an apple", 'str_2': 'it"s an apple'}
5、YAML支持多行字符串。
案例。
str:
这是
字符
串
Python 输出效果如下。
# 把多行合成一行字符串后,每行之间会有个空格
{'str': '这是 字符 串'}
6、多行字符串可以使用|保留换行符。
案例。
str: |
这是
字符
串
Python 输出效果如下。
{'str': '这是n字符n串n'}
6、引用写法
YAML通过“插锚”的形式,利用锚点和别名,对数据进行引用。
插锚写法。
user_base_info: &base_info
sex: 女
cultural: 小学
user_1:
name: 小丽
*base_info :
user_2:
name: 小花
*base_info :
等同如下写法。
user_base_info: &base_info
sex: 女
cultural: 小学
user_1:
name: 小丽
sex: 女
cultural: 小学
user_2:
name: 小花
sex: 女
cultural: 小学
Python 输出效果如下。
{
'user_base_info': {'sex': '女', 'cultural': '小学'},
'user_1': {'sex': '女', 'cultural': '小学', 'name': '小丽'},
'user_2': {'sex': '女', 'cultural': '小学', 'name': '小花'}
}
&
用来建立锚点(defaults
),<<
表示合并到当前数据,*
用来引用锚点。这种写法的好处在于简化重复数据
的多次编写。
不仅对象可以用锚,数组也可以用锚。
案例。
- &animal Bee
- Cat
- Dog
- Tiger
- *animal
Python 输出效果如下。
['Bee', 'Cat', 'Dog', 'Tiger', 'Bee']
7、YAML文本格式化
所谓格式化,就是我们常说的参数化。首先说明,YAML语言是无法做到格式化的。所以我们可以接住Python的一些方法,对我们数据进行格式化。
当Python读取到YAML文本的数据时,整个YAML文本其实是一个完整的字符串,既然是字符串,所以,我们可以使用Python字符串的方法,对我们数据进行参数化的操作。
字符串格式化的方法有很多,这里用2个案例来举例,分别是:format、Template。
1、利用format方法格式化。
YAML文本原始数据。
parameterize: {name}
Python代码。
import yaml
name = "蘑菇"
with open("~/SimpleAPI/Data/haloLogin/test.yaml", "r", encoding="utf-8") as f:
# 读取YAML数据,ref读取到的数据就是一个完整的字符串
# format方法是将字符串中特定的关键字进行转换
ref = f.read().format(name="蘑菇")
data = yaml.safe_load(ref)
f.close()
print(data)
Python 输出效果如下。
{'parameterize': '蘑菇'}
2、利用Template方法格式化。
YAML文本原始数据。
parameterize: ${name}
Python代码。
import yaml
# 引入Template类
from string import Template
name = "蘑菇"
with open("~/Data/haloLogin/test.yaml", "r", encoding="utf-8") as f:
# 读取YAML数据,ref读取到的数据就是一个完整的字符串
ref = f.read()
# Template_1:实例化Template类,并且把格式化的字符串传进去
Template_1 = Template(ref)
# substitute:通过字典方法,传入要格式化的数据
# {"name": name}:key是字符串中值,value是要替换的目标内容
Template_2 = Template_1.substitute({"name": name})
data = yaml.safe_load(Template_2)
f.close()
print(data)
Python 输出效果如下。
{'parameterize': '蘑菇'}
———END———
用脑思考,用心琢磨,用行动证实。看完文章后,赶紧打开你的编辑器实践吧。在实践的时候一定要多注意YAML语言编写的格式,例如缩进、数据结构、等。
想了解更多关于测试的知识,点击下方公众号,关注我们吧。👇🏻👇🏻👇🏻
发表评论