yaml语法格式

ads

点击上方👆🏻【东风大蘑菇】关注我


目录:

    一、简介

        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处理模块:yamlimport 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.yamldata = [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': [123'中文']}

注意📢:数组、对象确实可以结合使用,但是最顶层的数据结构,必须只能是同一个数据结构。例如案例中的"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.1int: 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# 可以用 ~ 代替 nullnull_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 applestr_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 Templatename = "蘑菇"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语言编写的格式,例如缩进、数据结构、等。


想了解更多关于测试的知识,点击下方公众号,关注我们吧。👇🏻👇🏻👇🏻


最后编辑于:2024/1/10 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com