美文网首页
yaml数据处理

yaml数据处理

作者: 阿登20 | 来源:发表于2020-11-17 16:45 被阅读0次

    yaml的使用

     yaml读取数据结构总局:
    
    **1.存储字典时,以[key:value]的形式定义**
    
    **2.存储列表时,需要使用[- 元素]表示列表**
    
    **3.存储多组数据时,需要每组数据之间使用3个横杠- 分割分割**
    
    **4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少**
    
    **5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning**
    yaml写入文件总结:
    1.写入一组数据直接使用dump方法或者dump_all方法也可
    
    2.写入多组数据只能使用dump_all方法
    
    3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示
    
    image.png image.png image.png

    一 、yaml的基础规则

    首先了解一下yaml最基础、最常用的语法

    • 大小写敏感
    • 使用缩进代表层级关系
    • 缩进只能用空格,不能使用Tab
    • 不要求空格个数,只要相同层级左对齐
    • 冒号后面需要输入一个空格,再输入值

    二、yaml的安装

    pip install pyyaml

    三、yaml的数据结构

    1.列表

    • - 后面跟空格 value
    • - 处于同一列表示同级关系
    • -不跟任何东西,下面缩进跟上 - value 可以嵌套

    list嵌套必须满足。如下样式

    - 
     - 1
     - 2
      
    
    image.png
    - name
    - age
    - sex
    -
        - 1
        - 2
        - 3
    -
        - 4
        - 5
        -
           - 6
    
    

    输出:['name', 'age', 'sex', [1, 2, 3], [4, 5, [6]]]

    • 列表嵌套字典
    -
        name: 阿登
        age: 18
    -
        name: 向佳
        age: 20
    -
        - 1
        - 2
        - 3
    

    输出:

    [{'name': '阿登', 'age': 18}, {'name': '向佳', 'age': 20}, [1, 2, 3]]

    2.字典

    使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map[字典]

    name: 阿登
    age: 18
    sex: 男
    hobby: 女
    

    结果:{'name': '阿登', 'age': 18, 'sex': '男', 'hobby': '女'}

    • 字典嵌套字典

    • dict1:
        name: 阿登
        age: 18
      
      dict2:
        name: 向佳
        age: 20
      

    结果:{'dict1': {'name': '阿登', 'age': 18}, 'dict2': {'name': '向佳', 'age': 20}}

    • 字典嵌套列表
    dict1:
        - name
        - age
    
    dict2:
        - adeng
        -  18
    

    结果:{'dict1': ['name', 'age'], 'dict2': ['adeng', 18]}

    yaml数据结构要注意层级缩进。同一列的表示在一个层级。如果要嵌套需要换行

    3. 纯量

    yaml中提供了多种纯量,包括整数、浮点数、字符串、null、日期、布尔值、时间

    n7: !!str true  # boolean转str
    
    boolean:
      - TRUE  # true, True都可以
      - FALSE  # false, False都可以
    
    float:
      - 3.14
      - 6.8523015e+5  # 可以使用科学计算法
    
    int:
      - 123
      - 0b1010_0111_0100_1010_1110  # 二进制表示
    
    null:
      nodeName: 'node'
      parent: ~  # 使用~表示null
    
    string:
      - 哦豁
      - 'hello world'  # 可以使用双引号或者单引号包裹特殊字符
      - newline
        newline2  # 字符串可以折成多行,每一行会被转化成空格
    
    date:
      - 2020-10-14  # 日期必须使用ISO 8601格式,即YYYY-mm-dd
    
    datetime:
      - 2020-11-14T08:56:30+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+号代表
    

    { 'aaa': 'true', 'boolean': [True, False], 'date': [datetime.date(2020, 10, 14)], 'datetime': [datetime.datetime(2020, 11, 14, 8, 56, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))], 'float': [3.14, 685230.15], 'int': [123, 685230], 'string': ['哦豁', 'hello world', 'newline newline2']

    }

    四、yaml读文件

    单个文件读取

    1. f = open(filename,"r")
    2. yaml.load(f,Loader=yaml.FullLoader) Loader=yaml.FullLoader解决警告问题
    import yaml
    from pprint import pprint
    
    
    with open(r"yaml_data.yaml") as f:
        data = yaml.load(f, Loader=yaml.FullLoader)
        pprint(data)
    

    yaml读取多组数据

    loade_all方法读取多组数据,返回的是一个生成器。可以for循环得到每一组数据

    aaa: !!str true  # boolean转str
    boolean:
      - TRUE  # true, True都可以
      - FALSE  # false, False都可以
    
    ---
    float:
      - 3.14
      - 6.8523015e+5  # 可以使用科学计算法
    
    import yaml
    from pprint import pprint
    
    with open(r"yaml_data.yaml") as f:
        data = yaml.load_all(f, Loader=yaml.FullLoader)
        pprint(data)
        for i in data:
            pprint(i)
            
    <generator object load_all at 0x00000000128FF890> 生成器
    
    {'aaa': 'true', 'boolean': [True, False]}
    {'float': [3.14, 685230.15]}
    

    通过输出结果及yaml存储内容可以看出,当yaml文件存储多组数据在一个yaml文件中时,需要使用3个横杆分割,读取数据时需要使用load_all方法,而且此方法返回一个生成器

    yaml读取数据结构:

    1.存储字典时,以[key:value]的形式定义

    2.存储列表时,需要使用[- 元素]表示列表

    3.存储多组数据时,需要每组数据之间使用3个横杠- 分割分割

    4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少

    5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning

    五、yaml写入文件

    • dump方法 写入到文件。

      • 第一个参数是 构造的数据

      • 第2个参数是文件对象 f

      • allow_unicode=True 写入中文时,不乱码

      • indent 可以设置缩进空格 格式

    import yaml
    from pprint import pprint
    
    
    datas = {
        "status": 1,
        "code": "1001",
        "data": [
            {
                "id": 80,
                "regname": "toml",
                "pwd": "QW&@JBK!#&#($*@HLNN",
                "mobilephone": "13691579846",
                "leavemount": "0.00",
                "type": "1",
                "regtime": "2019-08-14 20:24:45.0"
            },
            {
                "id": 81,
                "regname": "toml",
                "pwd": "QW&@JBK!#&#($*@HLNN",
                "mobilephone": "13691579846",
                "leavemount": "0.00",
                "type": "1",
                "regtime": "2019-08-14 20:24:45.0"
            }
        ],
        "msg": "获取用户列表成功"
    }
    with open("yaml_data1.yaml",mode="w",encoding="utf-8") as f1:
        yaml.dump(datas,f1, allow_unicode=True,indent=2)
        
    

    写入的样式:

    code: '1001'
    data:
    - id: 80
      leavemount: '0.00'
      mobilephone: '13691579846'
      pwd: QW&@JBK!#&#($*@HLNN
      regname: toml
      regtime: '2019-08-14 20:24:45.0'
      type: '1'
    - id: 81
      leavemount: '0.00'
      mobilephone: '13691579846'
      pwd: QW&@JBK!#&#($*@HLNN
      regname: toml
      regtime: '2019-08-14 20:24:45.0'
      type: '1'
    msg: 获取用户列表成功
    status: 1
    

    写入多个

    dump_all方法

    • documents 多个数组写入传入一个元组
    • stream 传入 文件对象
    • allow_unicode=True 写入文件防止中文乱码。
    • indent=2 缩进间隔
    import yaml
    from pprint import pprint
    
    datas = {
        "status": 1,
        "code": "1001",
        "data": [
            {
                "id": 80,
                "regname": "toml",
                "pwd": "QW&@JBK!#&#($*@HLNN",
                "mobilephone": "13691579846",
                "leavemount": "0.00",
                "type": "1",
                "regtime": "2019-08-14 20:24:45.0"
            },
            {
                "id": 81,
                "regname": "toml",
                "pwd": "QW&@JBK!#&#($*@HLNN",
                "mobilephone": "13691579846",
                "leavemount": "0.00",
                "type": "1",
                "regtime": "2019-08-14 20:24:45.0"
            }
        ],
        "msg": "获取用户列表成功"
    }
    
    info = {
        "name": "阿登",
        "age": 18
    }
    with open("yaml_data1.yaml",mode="w",encoding="utf-8") as f1:
        yaml.dump_all(documents=(datas, info),stream=f1,allow_unicode=True,indent=2)
        
        
        
    

    结果:

    code: '1001'
    data:
    - id: 80
      leavemount: '0.00'
      mobilephone: '13691579846'
      pwd: QW&@JBK!#&#($*@HLNN
      regname: toml
      regtime: '2019-08-14 20:24:45.0'
      type: '1'
    - id: 81
      leavemount: '0.00'
      mobilephone: '13691579846'
      pwd: QW&@JBK!#&#($*@HLNN
      regname: toml
      regtime: '2019-08-14 20:24:45.0'
      type: '1'
    msg: 获取用户列表成功
    status: 1
    ---             写入多组数据三个扛  -
    age: 18
    name: 阿登
    

    yaml写入文件总结:

    1.写入一组数据直接使用dump方法或者dump_all方法也可

    2.写入多组数据只能使用dump_all方法

    3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示

    相关文章

      网友评论

          本文标题:yaml数据处理

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