YAML
可用来编写配置文件的语言。查看工具:http://nodeca.github.io/js-yaml/
1.yaml文件规则
区分大小写;
使用缩进表示层级关系;
使用空格键缩进,而非Tab键缩进
缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
注释标识为#
在python中使用:需先安装pyyaml模块
pip install pyyaml
2.数据结构
对象:即字典,用冒号表示,格式为key: value。冒号后面要加一个空格;
key:
name: han
text: word
id:
sex: 女
表示为:
{ key: { name: 'han', text: 'word' }, id: { sex: '女' } }
数组:即列表,使用一个短横线加一个空格代表一个数组项;
-
- id: id1
- text
- xpath
-
- id2: id3
表示为:
[ [ { id: 'id1' }, 'text', 'xpath' ], [ { id2: 'id3' } ] ]
综合:
- id: id1
- xpath: path1
- xpath: path2
input: word
- id : id2
get: text
assert: word2
- id: id3
同层级的-
归属于一个列表,列表内由各个dict组成,同层级的对象同属于一个dict内,以上表示为:
[ { id: 'id1' },
{ xpath: 'path1' },
{ xpath: 'path2', input: 'word' },
{ id: 'id2', get: 'text', assert: 'word2' },
{ id: 'id3' } ]
常量:YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。
特殊符号:
---
YAML可以在同一个文件中,使用—表示一个文档的开始,多个文档在一个yaml文件,使用 ---
分隔方式来分段。
...
在一个配置文件中代表一个文件的结束
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
相当于在一个yaml文件中连续写了两个yaml配置项。
引用:重复的内容在YAML中可以使用&
来完成锚点定义,使用*
来完成锚点引用
key:
- &id 1007
- &name han
- xpath: path
user:
- *id
- *name
- han: null
表示为:
{ key: [ 1007, 'han', { xpath: 'path' } ],
user: [ 1007, 'han', { han: null } ] }
3.python脚本使用
(1)读取yaml文件
def yaml_load(yaml_file):
file = open(yaml_file,'r',encoding='utf-8')
file_data = file.read()
print(file_data)
file.close()
yaml_data = yaml.safe_load(file_data)
for i in yaml_data:
print(i)
(2)读取一个yaml文件中多个文档
使用load_all函数来解析全部的文档,再从中读取对象中的数据。
yaml文件:
---
- name: hanqingqing
sex: '女'
old: 24
- name: yanping
sex: '女'
old: 22
---
key:
- name
- sex
- old
value:
- hanqingqing
- 'mv'
- 24
#读取yaml文件的多个文档
def yaml_load_all(yaml_file):
file = open(yaml_file,'r',encoding='utf-8')
file_data = file.read()
print(file_data)
file.close()
yaml_data = yaml.load_all(file_data)
for i in yaml_data:
print(i)
path = os.path.abspath(".")
yaml_path = os.path.join(path, 'test.yaml')
yaml_load_all(yaml_path)
输出为:
[{'name': 'hanqingqing', 'sex': '女', 'old': 24}, {'name': 'yanping', 'sex': '女', 'old': 22}]
{'key': ['name', 'sex', 'old'], 'value': ['hanqingqing', 'mv', 24]}
(3)python对象生成yaml文档
方法一:yaml.dump()方法(有些博客说这个方法不能直接生成yaml标准格式,但试了一下貌似可以直接生成?)
def yaml_dump(yaml_file):
file = open(yaml_file,'w',encoding='utf-8')
project = {'key': ['name', 'sex', 'old'], 'value': ['hanqingqing', 'mv', 24]}
yaml.dump(project,file)
file.close()
方法二:使用ruamel模块中的yaml方法
前提条件:需提前安装ruamel.yaml模块,pip3 install ruamel.yaml
def ruamel_yaml_dump(yaml_file):
file = open(yaml_file, 'w', encoding='utf-8')
project = [{'name': 'hanqingqing', 'sex': '女', 'old': 24}, {'name': 'yanping', 'sex': '女', 'old': 22}]
yaml.dump(project,file,Dumper=yaml.RoundTripDumper)
file.close()
path = os.path.abspath(".")
yaml_path2 = os.path.join(path, 'dump.yaml')
ruamel_yaml_dump(yaml_path2)
生成的yaml文件:
- name: hanqingqing
sex: "\u5973"
old: 24
- name: yanping
sex: "\u5973"
old: 22