zoukankan      html  css  js  c++  java
  • Python基础笔记1-Python读写yaml文件(使用PyYAML库)

    最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记。

    一,YAML 简介

    YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。

    二,YAML 语法

    • 支持的数据类型:

      字典、列表、字符串、布尔值、整数、浮点数、Null、时间等

    • 基本语法规则:

      1、大小写敏感

      2、使用缩进表示层级关系

      3、相同层级的元素左侧对齐

      4、键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔

      5、数组前加有 “-” 符号,符号与值之间需用空格分隔

      6、None值可用null 和 ~ 表示

      7、多组数据之间使用3横杠---分割

      8、# 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错

      注意:网上查找到各种博客都提到yaml缩进时不能使用tab键,但我在pycharm编辑器里实际使用时是可以使用tab键进行缩进的,读写时并没有报错!

    三,安装第三方yaml文件处理库PyYAML

    python没有自带的处理yaml文件的库,需要下载第三方库PyYAML 或 ruamel.yaml ,这里我们安装PyYAML。

    pip install pyyaml
    # 下载速度慢的话加上清华镜像源
    pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    四,读取yaml文件

    1,从yaml中读取字典

    yaml中的字典格式如下:

    # yaml文件,文件名为yamlData
    
    os: Android
    osVersion: 10
    account:
      username: xiaoqq
      password: 123456
    deviceName: null
    appPackage: ~
    bool1: True
    

    读取字典代码:

    # @author: 给你一页白纸
    
    import yaml
    
    with open('./yamlData.yml', 'r', encoding='utf-8') as f:
        result = yaml.load(f.read(), Loader=yaml.FullLoader)
    print(result, type(result))
    print(result['os'], type(result['os']))
    print(result['osVersion'], type(result['osVersion']))
    print(result['account'], type(result['account']))
    print(result['account']['username'])
    print(result['deviceName'])
    print(result['appPackage'])
    print(result['bool1'], type(result['bool1']))
    

    读取结果:

    {'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None} <class 'dict'>
    Android <class 'str'>
    10 <class 'int'>
    {'username': 'xiaoqq', 'password': 123456} <class 'dict'>
    xiaoqq
    None
    None
    True <class 'bool'>
    

    从读取结果可以看出:

    1,读取出来的数据不会改变原数据类型,即yaml里是什么数据类型,读出来就是什么类型。

    2,Loader=yaml.FullLoader参数不写的话对结果不会有影响,但运行时会出现警告信息。

    3,yaml.load(f.read(), Loader=yaml.FullLoader)也可以写成yaml.load(f, Loader=yaml.FullLoader),读取出来的结果相同。

    2,从yaml中读取list

    yaml中list格式:数据前加'-' 并使用空格与数据间隔开,如下:

    # yaml文件名yamlData
    
    - Android
    - 10
    - null
    - ~
    - True
    

    读取list代码:

    # @author: 给你一页白纸
    
    import yaml
    
    with open('./yamlData.yml', 'r', encoding='utf-8') as f:
        result = yaml.load(f.read(), Loader=yaml.FullLoader)
    print(result, type(result))
    

    读取结果:

    ['Android', 10, None, None, True] <class 'list'>
    

    3,从yaml中读取元组

    yaml中存储元组格式:yaml中使用!!对数据类型进行转换,yaml中tuple由list转换而来。如下:

    # yaml文件名yamlData
    
    !!python/tuple
    - Android
    - 10
    - null
    - ~
    - True
    

    读取元组代码:

    # @author: 给你一页白纸
    
    import yaml
    
    with open('./yamlData.yml', 'r', encoding='utf-8') as f:
        result = yaml.load(f.read(), Loader=yaml.FullLoader)
    print(result, type(result))
    

    读取结果:

    ('Android', 10, None, None, True) <class 'tuple'>
    

    在实际使用中,很多的时候往往是多种类型嵌套的数据。如下yaml数据

    # yaml文件名yamlData
    
    os: Android
    osVersion: 10
    account:
      - username1: xiaoqq
      - password1: 123456
      - username2: Lilei
      - password2: 888888
    deviceName: null
    appPackage: ~
    bool1: True
    

    读取结果:

    {'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}
    

    4,从yaml中读取多组数据

    yaml多组数据时,每组数据之间需要用3横杠分隔'---',如下:

    os: Android
    osVersion: 10
    account1:
      username1: xiaoqq
      password1: 123456
    ---
    os: ios
    osVersion: 12
    account1:
      username2: Lilei
      password2: 888888
    

    从yaml中读取多组数据时需要使用yaml.load_all()方法,返回结果为一个生成器,需要使用for循环语句获取每组数据。代码如下:

    # @author: 给你一页白纸
    
    import yaml
    
    with open('./yamlData.yml', 'r', encoding='utf-8') as f:
        result = yaml.load_all(f.read(), Loader=yaml.FullLoader)
        print(result, type(result))
        for i in result:
            print(i)
    

    读取结果:

    <generator object load_all at 0x000001F78EBD5B48> <class 'generator'>
    {'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}}
    {'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}}
    

    五,写入yaml文件

    1,单组数据写入yaml文件

    使用yaml.dump()方法,加入allow_unicode=True参数防止写入的中文乱码,如下:

    # @author: 给你一页白纸
    
    import yaml
    
    apiData = {
       "page": 1,
       "msg": "地址",
       "data": [{
          "id": 1,
          "name": "学校"
       }, {
          "id": 2,
          "name": "公寓"
       }, {
          "id": 3,
          "name": "流动人口社区"
       }],
    }
    
    with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
       yaml.dump(data=apiData, stream=f, allow_unicode=True)
    

    写入结果:

    data:
    - id: 1
      name: 学校
    - id: 2
      name: 公寓
    - id: 3
      name: 流动人口社区
    msg: 地址
    page: 1
    

    2,多组数据写入yaml文件

    使用yaml.dump_all()方法,如下:

    # @author: 给你一页白纸
    
    import yaml
    
    apiData1 = {
       "page": 1,
       "msg": "地址",
       "data": [{
          "id": 1,
          "name": "学校"
       }, {
          "id": 2,
          "name": "公寓"
       }, {
          "id": 3,
          "name": "流动人口社区"
       }],
    }
    
    apiData2 = {
       "page": 2,
       "msg": "地址",
       "data": [{
          "id": 1,
          "name": "酒店"
       }, {
          "id": 2,
          "name": "医院"
       }, {
          "id": 3,
          "name": "养老院"
       }],
    }
    
    with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
       yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)
    

    写入结果:

    data:
    - id: 1
      name: 学校
    - id: 2
      name: 公寓
    - id: 3
      name: 流动人口社区
    msg: 地址
    page: 1
    ---
    data:
    - id: 1
      name: 酒店
    - id: 2
      name: 医院
    - id: 3
      name: 养老院
    msg: 地址
    page: 2
    

    在Python中除了PyYAML库之外,还有ruamel.yaml库也可以对yaml文件进行读写操作,后续再记笔记进行介绍。

  • 相关阅读:
    转ihone程序内发邮件,发短信,打开链接等
    plist 文件的读写
    转object c语法速成
    转iphone项目之间的引用。
    object c求nsstring 长度和去掉前后空格的方法
    object c runtime中类类型和消息支持检查
    转NSDictionary类使用
    设置UITableview 浮动的 header
    NSString 类型plist转为NSDictionary
    ObjectiveC Unicode 转换成中文
  • 原文地址:https://www.cnblogs.com/lfr0123/p/13652243.html
Copyright © 2011-2022 走看看