YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。YAML在python语言中有PyYAML安装包。
YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
一.Yaml的简介
1.基本语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样
2.三种数据结构
- 对象: 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组: 一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars): 单个的、不可再分的值
以下对这三种数据结构进行介绍。
2.1 对象
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
还可以使用缩进表示层级关系;
animal: pets
对应Python:
{'animal':'pets'}
Yaml 也允许另一种写法,将所有键值对写成一个行内对象(即字典嵌套字典)。
Paul: { name: Steve, foo: bar }
或者
Paul:
name: Steve
foo: bar
对应Python:
'Paul': {
'name': 'Steve',
'foo': 'bar'
}
2.2 数组
一组连词线开头的行,构成一个数组,即前面加一个‘-’符号。
- Cat
- Dog
- Goldfish
对应Python:
['Cat', 'Dog', 'Goldfish']
或者数组里嵌套字典:
- username: zhangsan
- password: lisi
对应Python:
[{'username': 'zhangsan'},{'password': 'lisi'}]
或者字典里嵌套数组:
animal:
- Cat
- Dog
- Goldfish
对应Python:
{'animal': ['Cat', 'Dog', 'Goldfish']}
或者数组里嵌套数组(数据结构的子成员是一个数组,则可以在该项下面缩进一个空格):
-
- Cat
- Dog
- Goldfish
对应Python:
[['Cat', 'Dog', 'Goldfish']]
2.3 纯量
int和float类型的数字
it: 123
ft: 12.30
对应Python:
{'it': 123, 'ft': 12.3}
布尔值用true和false表示
te: true
fe: false
对应Python:
{'te': True, 'fe': False}
None用~表示
non:~
对应Python:
{'non': None}
时间采用 ISO8601 格式
iso8601: 2001-12-14t21:21:21.10+08
对应Python:
{'iso8601': datetime.datetime(2001, 12, 14, 21, 21, 21, 100000)}
日期采用复合 iso8601 格式的年、月、日表示。
date: 2019-07-10
对应Python:
{'date': datetime.date(2019, 7, 10)}
YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
对应Python:
{'e': '123', 'f': 'true'}
2.4 复合结构
对象和数组可以结合使用,形成复合结构。
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
对应Python:
{'languages': ['Ruby', 'Perl', 'Python'],
'websites':
{
'YAML': 'yaml.org',
'Ruby': 'ruby-lang.org',
'Python': 'python.org',
'Perl': 'use.perl.org'
}
}
2.5 引用
锚点&和别名,可以用来引用。*
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
对应Python:
{'defaults':
{
'adapter': 'postgres',
'host': 'localhost'
},
'development':
{
'adapter': 'postgres',
'host': 'localhost',
'database': 'myapp_development'
},
'test':
{
'adapter': 'postgres',
'host': 'localhost',
'database': 'myapp_test'
}
}
*&用来建立锚点(defaults),<<表示合并到当前数据,用来引用锚点。
二.代码示例
首先使用pip安装pyyaml模块。
$ pip install PyYAML
先在yaml_test.yaml文件下写desired capability的配置信息:
platformName: Android
platformVersion: 6.0.1
deviceName: 127.0.0.1:21503
appPackage: com.baidu.homework
appActivity: com.baidu.homework.activity.index.IndexActivity
noReset: True
对应实例读取上面的配置信息
import yaml
import os
PATH=lambda p:os.path.abspath(os.path.join(os.path.dirname(__file__),p))
def yaml_data():
with open(PATH(u'yaml_test.yaml'),encoding='utf-8') as f:
data=f.read()
return yaml.load(data,Loader=yaml.FullLoader)
if __name__ == '__main__':
print(yaml_data())
PS:yaml 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数
1.yaml.load(f, Loader=yaml.FullLoader)
2.yaml.warnings({'YAMLLoadWarning': False}) # 全局设置警告,不推荐
Loader的几种加载方式
BaseLoader--仅加载最基本的YAML
SafeLoader--安全地加载YAML语言的子集。建议用于加载不受信任的输入。
FullLoader--加载完整的YAML语言。避免任意代码执行。这是当前(PyYAML 5.1)默认加载器调用
yaml.load(input)(发出警告后)。
UnsafeLoader--(也称为Loader向后兼容性)原始的Loader代码,可以通过不受信任的数据输入轻松利用。