zoukankan      html  css  js  c++  java
  • 配置文件语言之yaml

    一. Yaml

    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下载安装

    pip install yaml

    yaml数据类型详解

    支持数据类型

    1. 纯量(scalars):单个的、不可再分的值
    2. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
    3. 对象:键值对的集合,又称为映射(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语法表示如下:

    name: Tom Smith
    age: 37
    spouse:
        name: Jane Smith
        age: 25
    children:
     - name: Jimmy Smith
       age: 15
     - name: Jenny Smith
       age: 12
    familyInfo.yaml

    转化为Python的写法为:

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

    yaml数据操作

    数据读取:load()方法

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

    代码实现
    # 读取familyinfo.yaml文件的数据
    import yaml
    
    file = open('familyinfo.yaml', 'r')
    data = yaml.load(file)
    
    # 打印全量data数据
    print(data)
    
    # 获取配偶信息
    print(data['spouse'])
    
    # 分别获取配偶的姓名和年龄
    print(data['spouse']['name'])
    print(data['spouse']['age'])
    
    # 获取所有孩子的信息
    print(data['children'])
    
    # 分别获取每个孩子的信息
    print(data['children'][0])
    print(data['children'][0]['name'])
    print(data['children'][0]['age'])
    
    print(data['children'][1])
    print(data['children'][1]['name'])
    print(data['children'][1]['age'])
    
    # 修改Tom Smith的名字,但是不写入yaml文件
    data['name'] = 'Ma Mingchen'
    print(data['name'])
    
    # 修改第一个孩子的名字
    data['children'][0]['name']='Ma Yuhe'
    print(data['children'][0]['name'])
    yaml_load.py

    数据转化

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

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

    slogan=['welcome','to','BeiJing']
    website={'url':'www.baidu.com'}
    代码实现
    import yaml
    
    
    # 将下面python数据类型转化为yaml数据类型
    slogan=['welcome','to','BeiJing']
    website={'url':'www.baidu.com'}
    
    print(slogan)
    print(website)
    
    # 将python数据类型转换为yaml流
    print(yaml.dump(slogan))
    print(yaml.dump(website))
    yaml_dump.py
  • 相关阅读:
    nginx反向代理下没有获取到正确的clientIP问题发散
    TPL概要
    OAuth2:Authorization Flows
    ArrayList部分源码解析
    二分法之通用模板
    Leetcodet题目解析-1 c++版
    git初始用+将git项目上传到github
    参加ACM省赛有感
    杭电acm 1274展开字符串
    杭电acm 1263水果
  • 原文地址:https://www.cnblogs.com/victorm/p/10200019.html
Copyright © 2011-2022 走看看