YAML是一个比XML,JSON数据格式的更加方便,简洁的,易于阅读的序列化数据格式。在很多的脚本语言中都有应用,下面以其在Python语言中为例,总结下个人的心得。

在python中,我们一般用ini 文件来管理小规模的配置(用configparser来解析),用xml,json,或者csv,excel来管理大规模的配置。如果用yaml来管理配置,更加方便简单。

首先要装 PyYAML

安装起来很简单:

pip install pyyaml

我们可以参考阮一峰老师的教程:

YAML语言教程

总的来说,语法没什么难度,也是人们司空见惯的了。大小写敏感

使用缩进表示层级关系

缩进时不允许使用Tab键,只允许使用空格。

缩进的空格数目不重要,只要相同层级的

使用空白字元为文件缩排来表示结构;不过不能使用跳格字元(TAB)。

注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)

每个清单成员以单行表示,并用短杠+空白( - )起始。或使用方括号( [ ] ),并用逗号+空白( , )分开成员。

每个杂凑表的成员用冒号+空白( : )分开键值和内容。或使用大括号( { } ),并用逗号+空白( , )分开。

杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。

字串平常并不使用引号,但必要的时候可以用双引号 ( “ )或单引号 ( ‘ )框住。

使用双引号表示字串时,可用倒斜线( \ )开始的跳脱字元(这跟C语言类似)表示特殊字元。

区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。

在单一档案中,可用连续三个连字号(—-)区分多个档案。

另外,还有选择性的连续三个点号( … )用来表示档案结尾。

数值型: 直接书写即可。不区分整型还是浮点型。

字符串: 字符串可以加引号,也可以不加。

时间: ISO8601 格式。如2017-12-14t21:59:43.10-05:00

日期: 采用复合 iso8601 格式的年、月、日表示。如1970-01-01

关于强制类型转换: 可以通过两个英文感叹号+新的数据类型的方式来进行强制的类型转换。

如:

e: !!str 123

f: !!str true

将变为:

{ e: '123', f: 'true' }

yaml.load与yaml.dump方法

该模块提供了一些方法,不过常用的方法只有两个yaml.load和yaml.dump ,以下是一个版本相关的yaml 格式文件:

treeroot:

branch1:

name: Node 1

branch1-1:

name: Node 1-1

branch2:

name: Node 2

branch2-1:

name: Node 2-1

yaml.load方法:

import yaml

f = open('tree.yaml')

dataMap = yaml.load(f)

f.close()

print dataMap

执行结果:

{'treeroot': {'branch2': {'branch2-1': {'name': 'Node 2-1'}, 'name': 'Node 2'}, 'branch1': {'branch1-1': {'name': 'Node 1-1'}, 'name': 'Node 1'}}}

yaml与xml

# xml标记两个site

sina

http://http://www.sina.com

google

http://www.google.com

# 使用yaml标记两个site

---

site:

name: sina

url : http://www.sina.com

---

site:

name: google

url : http://www.google.com

# 使用yaml标记两个site

---

site: {name: sina, url: http://www.sina.com}

---

site: {name: google, url: http://www.google.com}

yaml与json

准确的说json 应该算是yaml 标准下的一个字集,可以很方便的转换。

a、转换YAML到JSON

import yaml,json

yml = """

---

foo: bar

"""

data = yaml.load(yml)

json = json.dumps(data)

print(json)

b、转换JSON到YAML

import json,yaml

str = '{ "foo": "bar" }'

data = json.loads(str)

yml = yaml.safe_dump(data)

print(yml)

于是我们可以把操作yaml封装成一个类:

class YAML():

# Write YAML file

@staticmethod

def write_yml(save_path, data):

with open(save_path, 'w', encoding='utf8') as outfile:

try:

yaml.safe_dump(data, outfile, default_flow_style=False, allow_unicode=True)

except yaml.YAMLError as exc:

print(exc)

# Read YAML file

@staticmethod

def read_yml(load_path):

with open(load_path, 'r') as stream:

try:

data_loaded = yaml.safe_load(stream)

return data_loaded

except yaml.YAMLError as exc:

print(exc)

@staticmethod

def read_settings_yml():

return YAML.read_yml(yaml_path)

每次只需要写好yaml文件以及路径就可以读写相应的文件,获取相应的值了。

比如我们用appium做mobile的自动化,

就可以简单写成:

---

Android:

platformName: Android

platformVersion: 5.0

deviceName: Nexus 5X

appPackage: com.

appActivity: com.ui.screens.activity.SplashActivity

resetKeyboard: True

noSign: True

noReset: True

deviceReadyTimeout: 5

#iPhone

IOS:

platformName: IOS

deviceName: iPhone 6s

app: /Users/anderson/nQAdebug.app

automationName: XCUITest

allowTouchIdEnroll: True

noSign: True

noReset: True

deviceReadyTimeout: 5

然后实现起来也很简单:

class Base_page():

capabilities = YAML().current_device()

if PLATFORM == 'Android':

capabilities['app'] = AppPath.get_app_filename(build_path)

capabilities['platformVersion'] = get_android_version()

capabilities['deviceName'] = get_device_name()

只要稍微管理下配置文件,就减少了很多维护成本了。