YAML是计算机可识别的直观数据序列化格式,便于人类阅读,也便于与脚本语言交互。 YML类似于XML,但语法比XML简单得多,在转换为数组或可混列数据时更简单有效。
一. PyYaml
1,load ) ) :返回一个对象
首先创建yml文件,config.yml:
name : tomsmithage :37 spouse : name : janesmithage :25 children :-name : jimmysmithage 336015-name 133: jeshage
importyamlf=open (r ' e : ) (自动测试(test _ framework (config (config.yml () y=yaml.load(f ) f ) prinnnng )
{'name': 'Tom Smith ',' age': 37,' spouse ' : { ' name ' : ' Jane Smith ',' age': 25},' chill
如果string或文件包含多个yaml文档,则可以使用yaml.load_all分析所有文档。
importyamlf=' ' ' '---name : James age :20---- name : sxdxmtage :19 ' ' y=YAML.load _ all (f ) fordated
{'name': 'James ',' age ' :20 } { ' name ' : ' sxd xmt ',' age': 19} 3,yaml.dump是一个python对象
importyamlaproject={ ' name ' : ' silenthandolleander ',' race': 'Human ',' traits': ['ONE_HAND
name : silenthandolleanderrace : human traits : [ one _ hand,ONE_EYE] yaml.dump接收的第二个参数是打开的文本文件
importyamlaproject={ ' name ' : ' silenthandolleander ',' race': 'Human ',' traits ' : [ ' one _ hand autauted
importyamlobj1={ ' name ' : ' James ',' age': 20}obj2=['sxdxmt ',19 ] withopen (r ' e : )自动物料管理系统
{age: 20,name: James}--- [sxdxmt,19]尼,yaml语法
1、基本规则
1 .大小写敏感2 .使用缩进表示级别关系3 .不要使用制表符进行缩进。 只能用空间。 4 .缩进的空间数并不重要。 如果同一级别的元素左对齐,则5. #表示注释,并从该注释开始一直忽略到行尾。 2、yaml转换词典
yaml支持映射或词典表示,如下所示:
#以下格式读取为Python上的dictname:灰蓝age: 0job: Tester输出。
{'name': '灰蓝',' age': 0,' job': 'Tester'} 3,yaml转盘
yaml支持列表或数组的表示形式,如下所示:
#以下格式在Python中读取为list-灰色蓝- 0- Tester输出。
[ '灰蓝',0,' Tester'] 4,复合结构:
词典和列表可以按如下方式复合使用。
#以下格式在Python中读取list包含dict- name:灰蓝age : job : tester-name 3360 James age :30输出。
[{'name': '灰蓝',age':' job': 'Tester'} ',{'name': 'James ',' age'3360}3]
0}]5、基本类型:
yaml中有以下基本类型:
我们写个例子来看下:
# 这个例子输出一个字典,其中value包括所有基本类型str: "Hello World!"int: 110float: 3.141boolean: true # or falseNone: null # 也可以用 ~ 号来表示 nulltime: 2016-09-22t11:43:30.20+08:00 # ISO8601,写法百度date: 2016-09-22 # 同样ISO8601输出:
{'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000), 'date': datetime.date(2016, 9, 22)}如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了
str: 灰蓝str1: "Hello World"str2: "HellonWorld"输出:
{'str': '灰蓝', 'str1': 'Hello World', 'str2': 'HellonWorld'}这里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符;如:
str1: 'HellonWorld'str2: "HellonWorld"输出:
{'str1': 'Hello\nWorld', 'str2': 'HellonWorld'}可以看到,单引号中的’n’最后是输出了,双引号中的’n’最后是转义成了回车
6、引用
& 和 * 用于引用
这个相当于一下脚本:
name: 灰蓝tester: 灰蓝输出:
{'name': '灰蓝', 'tester': '灰蓝'}7、强制转换
yaml是可以进行强制转换的,用 !! 实现,如下:
输出:
{'int': 123, 'str': '3.14'}明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型。
8、分段
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中
三、构造器(constructors)、表示器(representers)、解析器(resolvers )
1、yaml.YAMLObject
yaml.YAMLObject用元类来注册一个构造器(也就是代码里的 init() 方法),让你把yaml节点转为Python对象实例,用表示器(也就是代码里的 repr() 函数)来让你把Python对象转为yaml节点,看代码:
输出:
!person {age: 20, name: James}Person(name=sxdxmt, age=19)2、yaml.add_constructor 和 yaml.add_representer
你可能在使用过程中并不想通过上面这种元类的方式,而是想定义正常的类,那么,可以用这两种方法
输出:
!!python/object:__main__.Person {age: 20, name: James}!person {age: 20, name: James}Person(sxdxmt, 19)第一行是没加表示器之前,多丑!中间那行是加了表示器之后,变成了规范的格式,下面添加了构造器,能够把 !person 标签转化为Person对象。
四、示例
yaml是一种很清晰、简洁的格式,而且跟Python非常合拍,非常容易操作,我们在搭建自动化测试框架的时候,可以采用yaml作为配置文件,或者用例文件,下面给出一个用例的示例