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
# 使用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()
只要稍微管理下配置文件,就减少了很多维护成本了。