1 什么是YAML?
全称为:YAML Ain’t Markup Language
,它不是标记语言,是一种轻量级数据交换格式; 是一个易读易理解的数据序列化格式; 面向文本,不同的语言中有相应的解析器和生成器,比如Python
中的PyYAML
; 可常用于各种语言的配置文件。
2 YMAL语法了解
使用空白符、缩进和一些符号表示数据结构; 使用缩进表示数据结构的层次; YMAL中字符串使用单引号、双引号均可; 注释或备注使用#
号;
2.1 数据类型
str : "Hello World"
int : 123
float : 3.14
bool : true
null: null
2.2 列表
分有序列表和无序列表; 有序列表以破折号表示,每个元素占一行;
array:
- item1
- item2
- item3
* item1
* item2
* item3
2.3 对象
map :
key1: value1
key2: value2
key3: value3
2.4 多行字符串
即可跨越多行的字符串; 用竖线或大于符号来表示; 竖线表示保留换行,大于号表示将多行合并成一行。
input_des: |
My name
is
noamanelson.
output_d: >
My name
is
noamanelson.
3 YAML的应用场景有哪些?
3.1 作为配置文件
比如自动化测试中的config.yaml,可以写一些环境配置信息,或者用来管理接口数据等; 比如开发项目中的配置文件,可以写数据库相关信息,域名,端口等信息; 示例:
Project: autotest
URl: xxx
env:
test: yyy
pro: zzz
mysql:
port: 8888
username: test1
password: 123456
3.2 作为数据交互
可标识接口的请求和响应,和管理接口数据道理一样; 示例:
method: POST
path: / login
params:
username: NoamaNelson
password: 123456
status: 200
mes: success
token: fdshfsdhfsdfiereiopojfdjfjd
body:
- userid: 1
name: NoamaNelson
3.3 其它场景
作为编排语言,用于容器编排工具中,如Kubernetes
、Docker
; 作为通用配置文件格式,用于自动化工具,如SaltStack
。
4 不同语言的解析和生成
Python
:pyyaml
库;Ruby
:psych
库;Java
:snakeyaml
库;JavaScript
:js-yaml
库。
5 使用pyyaml库解析
pip install pyyaml
str : "Hello World"
int : 123
float : 3.14
bool : true
null: null
array:
- item1
- item2
- item3
map :
key1: value1
key2: value2
key3: value3
input_des: |
My name
is
noamanelson.
output_d: >
My name
is
noamanelson.
Project: autotest
URl: xxx
env:
test: yyy
pro: zzz
Mysql:
port: 8888
username: test1
password: 123456
method: POST
path: / login
params:
username: NoamaNelson
password: 123456
status: 200
mes: success
body:
- userid: 1
name: NoamaNelson
import yaml
with open ( "config.yaml" ) as f:
yaml_obj = yaml. load( f, Loader= yaml. Loader)
print ( yaml_obj)
{ 'str' : 'Hello World' ,
'int' : 123 ,
'float' : 3.14 ,
'bool' : True ,
None : None ,
'array' : [ 'item1' , 'item2' , 'item3' ] ,
'map' : { 'key1' : 'value1' , 'key2' : 'value2' , 'key3' : 'value3' } ,
'input_des' : 'My name\nis\nnoamanelson.\n' ,
'output_d' : 'My name is noamanelson.\n' ,
'Project' : 'autotest' ,
'URl' : 'xxx' ,
'env' : { 'test' : 'yyy' , 'pro' : 'zzz' } ,
'Mysql' : { 'port' : 8888 , 'username' : 'test1' , 'password' : 123456 } ,
'method' : 'POST' ,
'path' : '/login' ,
'params' : { 'username' : 'NoamaNelson' , 'password' : 123456 } ,
'status' : 200 ,
'mes' : 'success' ,
'body' : [ { 'userid' : 1 , 'name' : 'NoamaNelson' } ] }
6 yaml.dump()和yaml.load()
6.1 yaml.dump()
dict_data = { 'key1' : 'value1' , 'key2' : { 'name' : 'xiaoming' } , 'key3' : [ { "name1" : "xiaozhang" } ] }
yaml_data = yaml. dump( dict_data)
print ( yaml_data)
key1: value1
key2:
name: xiaoming
key3:
- name1: xiaozhang
6.2 yaml.load()
dict_data = { 'key1' : 'value1' , 'key2' : { 'name' : 'xiaoming' } , 'key3' : [ { "name1" : "xiaozhang" } ] }
yaml_data = yaml. dump( dict_data)
print ( yaml_data)
yaml_data1 = 'key1: value1\nkey2:\n name: xiaoli\n'
data = yaml. load( yaml_data1, Loader= yaml. FullLoader)
data1 = yaml. load( yaml_data, Loader= yaml. FullLoader)
print ( data)
print ( data1)
key1: value1
key2:
name: xiaoming
key3:
- name1: xiaozhang
{ 'key1' : 'value1' , 'key2' : { 'name' : 'xiaoli' } }
{ 'key1' : 'value1' , 'key2' : { 'name' : 'xiaoming' } , 'key3' : [ { 'name1' : 'xiaozhang' } ] }