zoukankan      html  css  js  c++  java
  • 每天一点小进步(3):yaml文件的相关知识点

    一:yaml语法

    1、基本规则

    大小写敏感

    使用缩进表示层级关系

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

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

    #表示注释,从它开始到行尾都被忽略

    2、yaml转字典

    yaml中支持映射或字典的表示,如下:

    name:灰蓝
    age:0
    job:Tester
    

     转换成字段输出:

    {'name':'灰蓝', 'age':0, 'job':'Tester'}

    3、yaml转列表

    -灰蓝
    -0
    -Tester

    转换成列表输出

    ['灰蓝', 0, 'Tester']

    4、复合结构:

    字典和列表可以复合起来使用:

    -name:灰蓝
     age:0
     job:Tester
    -name:James
     age:30

    转换输出

    [{'name':'灰蓝', 'age':0, 'job': 'Tester'},{'name':'James', 'age': 30}]

    5、基本类型:

    yaml中有以下基本类型:

    字符串、整型、浮点型、布尔型、null、时间、日期

    str:"Hello World"
    int:110
    float:3.141
    boolean:true
    None:null
    time:2016-09-22t11:43:30.20+08:00
    date:2015-09-22

    转换后输出

    {'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 11, 43, 30, 200000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800))), 'date': datetime.date(2016, 9, 22)}

    如果字符串没有空格或者特殊字符,不需要加引号,否则需要加引号

    str: 灰蓝
    str1: "Hello World"
    str2: "Hello
    World"

    转换后输出

    {'str': '灰蓝', 'str1': 'Hello World', 'str2': 'Hello
    World'}

    双引号和单引号的区别,单引号中的特殊字符转成python会被转义(原样输出),双引号不会被python转义,最后输出特殊符号

    str1: 'Hello
    World'
    str2: "Hello
    World"

    转换后输出

    {'str1': 'Hello\nWorld', 'str2': 'Hello
    World'}

    6、引用

    &和*用于引用

    name: &name 无敌
    tester: *name

    转换后输出

    {'name': '无敌', 'tester': '无敌'}

    7、强制转换

    yaml可以进行强制转换,用!!实现

    str: !!str 3.14
    int: !!int "123"

    转换后输出

    {'str': '3.14', 'int': 123}

    “123”被强制转换成int,3.14被强制转换成str

    8、分段

    在同一个yaml文件中,可以用“-”来分段,这样可以将多个文档卸载一个文件中

    import yaml
    f = '''
    ---
    name: James
    age: 20
    ---
    name: Lily
    age: 19
    '''
    y = yaml.load_all(f)
    for data in y:
        print(data)

    load_all解析全部文档,返回一个迭代对象

    打印输出:

    {'name': 'James', 'age': 20}
    {'name': 'Lily', 'age': 19}

    二、构造器、表示器、解析器

    1、yaml.YAMLObject

    用元类来注册一个构造器,把yaml节点转为Python对象实例,用表示器把Python对象转为yaml节点

    import yaml
    class Person(yaml.YAMLObject):
        yaml_tag='!person'
    
        def __init__(self, name, age):
            self.name= name
            self.age = age
    
        def __repr(self):
            return '%s(name=%s, age=%d)' % (self.__class__.__name__, self.name, self.age)
    
    james = Person('james', 20)
    
    print(yaml.dump(james)) #python对象实例转为yaml
    
    lily = yaml.load('!person {name:Lily, age:19}')
    
    print(lily) #yaml转为python对象实例

    输出

    !person
    age: 20
    name: james
    
    <__main__.Person object at 0x107ad5860>

    2、yaml.add_constructor 和 yaml.add_representer

    你可能在使用过程中并不想通过上面这类元类的方式,而是想定义正常的类,那么,可以使用这两种方法

    import yaml
    
    
    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __repr__(self):
            return 'Person(%s, %s)' % (self.name, self.age)
    
    james = Person('James', 20)
    print (yaml.dump(james))  # 没加表示器之前
    
    
    def person_repr(dumper, data):
        return dumper.represent_mapping(u'!person', {"name": data.name, "age": data.age})  # mapping表示器,用于dict
    
    yaml.add_representer(Person, person_repr)  # 用add_representer方法为对象添加表示器
    print (yaml.dump(james))  # 加了表示器之后
    
    
    def person_cons(loader, node):
        value = loader.construct_mapping(node)  # mapping构造器,用于dict
        name = value['name']
        age = value['age']
        return Person(name, age)
    
    yaml.add_constructor(u'!person', person_cons)  # 用add_constructor方法为指定yaml标签添加构造器
    lily = yaml.load('!person {name: Lily, age: 19}')
    print (lily)

    输出:

    !!python/object:__main__.Person
    age: 20
    name: James
    
    !person
    age: 20
    name: James
    
    Person(Lily, 19)

    第一行是没加表示器之前,中间那行是加了表示器之后,变成了规范的格式,最后添加了构造器,能够把 !person 标签转化为Person对象。

  • 相关阅读:
    Reference Counting GC (Part two :Partial Mark & Sweep)
    Reference Counting GC (Part one)
    Union File System
    Linux Cgroups
    Mark Sweep GC
    取模运算
    负数取模怎么算
    牛客【2021寒假集训营第一场】J-一群小青蛙呱蹦呱蹦呱
    记codeforces一个简单模拟题
    筛法求素数
  • 原文地址:https://www.cnblogs.com/wx2017/p/13027322.html
Copyright © 2011-2022 走看看