数据驱动之Yaml实现

一、背景:数据及配置文件之争

数据及文件通常有三种类型:

配置文件型:如ini,conf,properties文件,适合存储简单变量和配置项,最多支持两层,不适合存储多层嵌套数据
表格矩阵型:如csv,excel等,适合于存储大量同类数据,不适合存储层级结构的数据
多层嵌套型:如XML,HTMl,JSON、YAML,TOML等,适合存储单条或少数多层嵌套数据,不适合存储大量数据
YAML兼容JSON格式,简洁,强大,灵活,可以很方便的构造层级数据并快速转为Python中的字典。

二、YMAL简介

YAML(YAML Ain’t Markup Language)即一种反标记(XML)语言。强调数据为中心,而非标记。YAML大小写敏感,使用缩进代表层级关系。
YAML中支持对象Object(对应Python中的字典), 数组Array(对应Python中的列表)以及常量(字符串、数字(int/float),true/false/null)。
相比于JSON格式,YAML免除了双引号,逗号,大括号,中括号等,(当然也支持原始的JSON格式),并且支持注释,类型转换,跨行,锚点,引用及插入等等。

三、基本书写格式

  • 对象:使用key: value表示,冒号后面有一个空格,也可以是使用{key: value} (flow流格式)或{“key”: “value”}表示
  • 数组:使用- value表示,-后面有一个空格,每项一行,也可以使用[value1,value2,value3,…] (flow流格式)或[“value1”, “value2”, “value3”, …]
  • 字符串:abc或"abc"
  • 数字:123或123.45
  • true/false:true/false,TRUE/FALSE,True/False或on/off, ON/OFF, On/Off
  • null: null,NULL, Null或~

示例文件demo.yaml:

# 注释:示例yaml文件
name: Cactus
age: 18
skills: 
  -
    - Python
    - 3
  -
    - Java
    - 5
has_blog: true
gf: ~

相当于以下JSON格式:

{
     
  "name": "Cactus",
  "age": 18,
  "skills": [
    [
      "Python",
      3
    ],
    [
      "Java",
      5
    ]
  ],
  "has_blog": true,
  "gf": null
}

四、Python操作YAML文件

4.1 安装yaml

pip install pyyaml

4.2 yaml常用方法介绍

和JSON文件类似,yaml也提供load和dump两种方法。

yaml.load()或yaml.safe_load(YAML字符串或文件句柄):yaml -> 字典,如yaml中有中文,需要使用 字符串.encode(‘utf-8’)或打开文件时指定encoding=‘utf-8’
yaml.dump(字典):默认为flow流格式,即字典{b’: {‘c’: 3, ‘d’: 4}},会被转为b: {c: 3, d: 4}形式,可以使用default_flow_style=False关闭流模式
由于yaml.load()支持原生Python对象,不安全,建议使用yaml.safe_load()

示例1:yaml字符串 -> 字典

import yaml
yaml_str = '''
name: Cactus
age: 18
skills: 
  -
    - Python
    - 3
  -
    - Java
    - 5
has_blog: true
gf: ~
'''
print(yaml.safe_load(yaml_str)) 

打印结果:

{'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}

如果有中文,可以使用yaml.load(yaml_str.encoding('utf-8))

示例2:yaml文件 -> 字典

import yaml
with open('demo.yaml', encoding='utf-8') as f:   # demo.yaml内容同上例yaml字符串 
    print(yaml.safe_load(f))

打印结果同上例

示例3:字典 -> yaml字符串或文件

import yaml
dict_var = {
     'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
print(yaml.dump(dict_var,))  # 转为字符串,使用默认flow流格式
with open('demo5.yaml', 'w', encoding='utf-8') as f:
    yaml.dump(dict_var, f, default_flow_style=False)  # 写入文件,不是用flow流格式

打印内容:

age: 18
gf: null
has_blog: true
name: Cactus
skills:
- [Python, 3]
- [Java, 5]

demo5.yaml文件内容:

age: 18
gf: null
has_blog: true
name: Cactus
skills:
- - Python
  - 3
- - Java
  - 5

更多操作可参考pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation

五、数据驱动之Yaml实现

5.1待续

六、特别说明

以上内容参考:临渊

你可能感兴趣的:(#,自动化测试)