美文网首页
yaml简介

yaml简介

作者: 酷飒de小姐姐 | 来源:发表于2021-05-10 16:49 被阅读0次

    yaml简介

    正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

    由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,JavaScript等。

    YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。比如同一段数据Josn和Yaml的表示分别如下:

    Json

    { name: 'Tom Smith',age: 37,spouse: { name: 'Jane Smith', age: 25 },children: [ { name: 'Jimmy Smith', age: 15 },{ name: 'Jenny Smith', age: 12 } ] }

    yaml

    name: Tom Smith

    age: 37

    spouse:

        name: Jane Smith

        age: 25

    children:

     - name: Jimmy Smith

       age: 15

     - name: Jenny Smith

       age: 12

    语法特点

    大小写敏感

    使用缩进表示层级关系

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

    缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

    yaml下载安装

    下载地址:http://pyyaml.org/wiki/PyYAML

    安装:下载完成后点击运行安装包即可。

    安装完成后在python引入yaml检测是否安装成功。

    PyYAML官方文档

    yaml数据类型详解

    支持数据类型

    纯量(scalars):单个的、不可再分的值

    数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

    对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

    纯量

    数据最小的单位,不可以再分割。类似于Python中单个变量

    flag

    list数组

    与Python的list数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。

    - Jack

    - Harry

    - Sunny

    # 也可以写成一行

    [Jack,Harry,Sunny]

    对应到python的list写法如下:

    ['Jack','Harry','Sunny']

    对象

    对象的一组键值对,使用冒号结构表示。类似Python中的字典数据结构。

    platformName: Android

    platformVersion: 6.0.1

    # Yaml 也允许另一种写法,将所有键值对写成一个行内对象。

    {platformName: Android,platformVersion: 6.0.1}

    注意:冒号后面一定要有空格!对应到python字典的写法如下:

    {'platformName': 'Android', 'platformVersion': '6.0.1'}

    数据嵌套

    yaml数据嵌套表示可以将上面的各类数据根据实际场景进行组合嵌套。

    数据场景

    Tom Smith 37岁,他有一个妻子叫 Jane Smith,25岁。 另外他有2个孩子,一个叫Jimmy Smith,15岁;另外一个叫Jenny Smith ,12岁。

    yaml语法表示如下:

    familyInfo.yaml

    name: Tom Smith

    age: 37

    spouse:

        name: Jane Smith

        age: 25

    children:

     - name: Jimmy Smith

       age: 15

     - name: Jenny Smith

       age: 12

    转化为Python的写法为:

    {'name':'Tom Smith','age':37,'spouse':{'name':'Jane Smith','age':25},'childern':[{'name':'Jimmy Smith','age':15},{'name':'Jenny Smith','age':12}]}

    yaml数据操作

    数据读取

    测试场景

    读取配置中的所有信息

    读取yaml数据表中Tom Smith的姓名、年龄、信息

    单独读取配偶的姓名和年龄信息

    分别读取两个孩子的姓名、年龄信息

    load方法

    load(stream, Loader=Loader) 解析文件流中的第一个YAML文档并生成相应的Python对象。

    代码实现

    yaml_load.py

    import yaml

    file=open('familyInfo.yaml','r')

    data=yaml.load(file)

    print(data)

    print(data['name'])

    print(data['age'])

    print(data['spouse'])

    print(data['spouse']['name'])

    print(data['spouse']['age'])

    print(data['children'])

    print(data['children'][0]['name'])

    print(data['children'][0]['age'])

    print(data['children'][1]['name'])

    print(data['children'][1]['age'])

    数据修改

    如果想改变某个数据,可以使用如下方法:

    data['name']='51zxw'

    print(data['name'])

    注意:此处只是变量类型的数据变更,不会真正修改到yaml配置表中的数据。

    数据转化

    方法:dump()可以将Python对象序列化成YAML流。如果stream为None,则返回生成的字符串。

    测试场景

    将下面python数据类型转化为yaml数据类型

    slogan=['welcome','to','51zxw']

    website={'url':'www.51zxw.net'}

    代码实践

    import yaml

    slogan=['welcome','to','51zxw']

    website={'url':'www.51zxw.net'}

    #python data

    print(slogan)

    print(website)

    #yaml data

    print(yaml.dump(slogan))

    print(yaml.dump(website))

    运行结果:

    C:\Python35\python.exe E:/AppiumScript/advance/yaml/yaml_down.py

    ['welcome', 'to', '51zxw']

    {'url': 'www.51zxw.net'}

    [welcome, to, 51zxw]

    {url: www.51zxw.net}

    Process finished with exit code 0

    Capability配置数据分离实践

    测试场景

    将capability的各项参数值与代码进行分离。

    场景分析

    把之前capability中各项写死的配置信息来抽离出来,存放在一个yaml配置文件中,使用 对象数据类型来存储数据;然后调用load()方法读取数据,从而实现数据和代码的分离。

    代码实现

    1.参数配置表:desired_caps.yaml

      "platformName": "Android",

      "platformVersion": "4.4.2",

      "deviceName": "127.0.0.1:62001",

      "appPackage": "com.包名",

      "appActivity": "org.cocos2dx.lua.AppActivity",

      "noReset": true

    capability_yaml.py

    from appium import webdriver

    import yaml

    file=open('desired_caps.yaml','r')

    data=yaml.load(file)

    desired_caps={}

    desired_caps['platformName']=data['platformName']

    desired_caps['platformVersion']=data['platformVersion']

    desired_caps['deviceName']=data['deviceName']

    desired_caps['app']=data['app']

    desired_caps['noReset']=data['noReset']

    desired_caps['appPackage']=data['appPackage']

    desired_caps['appActivity']=data['appActivity']

    driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub', desired_caps)

    报错分析

    yaml.scanner.ScannerError: mapping values are not allowed here

    该报错说明map对象数据类型写法错误,一般为“:”后面没有留空格。如:platformName:Android

    相关文章

      网友评论

          本文标题:yaml简介

          本文链接:https://www.haomeiwen.com/subject/cfmidltx.html