python模块篇07-yaml

三方库:ruamel.yaml


1、PyYAML库安装
  PyYAML为python解析yaml的库
  安装:pip3 install -U PyYAML

2、语法规则
  1.大小写敏感
  2.使用缩进表示层级关系
  3.缩进时不允许使用Tab键,只允许使用空格。
  4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

3、支持的数据结构
  1.对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  2.数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  3.纯量(scalars):单个的、不可再分的值


值为字符串
 animal: pets
    转换为python代码
 {'animal': 'pets'}
值为字典
         animal: {"ke1":"pets","key2":"app"} # python字典
        转换为python代码
           {animal: {"ke1":"pets","key2":"app"}} # 嵌套字典结构

数组
方式一
         animal: 
           - data1
           - data2
        转换为python代码
         {'animal': ['data1', 'data2']}

方式二
          animal: ['data1', 'data2'] # python列表
         转换为python代码
          {'animal': ['data1', 'data2']} # 字典嵌套列表

纯量(包含:字符串,布尔值,整数,浮点数,Null,日期)

    字符串
value: "hello"
转换为python代码
{"value":"hello"}

    布尔值
 value1: true
    value2: false
    转换为python代码
         {'value1': True, 'value2': False}

    整数,浮点数
    value1: 12
    value2: 12.102
    转换为python代码
    {'value1': 12, 'value2': 12.102}

    空(Null)
    value1: ~      # ~ 表示为空,None
    转换为python代码
    {'value1': None}

    日期
    value1: 2017-10-11 15:12:12
    转换为python代码
    {'languages': {'value1': datetime.datetime(2017, 10, 11, 15, 12, 12)}}

类型转换
使用!!str, !!float等可以将默认类型转为指定类型,如:
  - !!float 3
  - !!str 4
  - !!str true
对应JSON格式
  [
    3.0,
    "4",
    "true"
  ]

多行文本及拼接
  | 保留多行文本(保留换行符)
  > 将多行拼接为一行
示例:
  a: |
    我
    喜欢你

  b: >
    我
    不喜欢你
    才怪
对应JSON格式:
{
  "a": "我\n喜欢你\n",
  "b": "我 不喜欢你 才怪"
}


锚点&和引用*
    锚点:标注一个内容,锚点名称自定义
    引用:使用被标注的内容<<: *锚点名

例子:
     data: &imp
        value: 456
     name:
      value1: 123
      <<: *imp           # "<<:" 表示合并到当前位置,   "*imp" 表示引用锚点imp
    转换为python代码
     {'data': {'value': 456}, 'name': {'value': 456, 'value1': 123}}

案例1:读yaml文件
yaml文件内容
Search_Data:
    search_test_001:
        value: 456
        expect: [4,5,6]
    search_test_002:
        value: "你好"
        expect: {"value":"你好"}

读取yaml文件
方法:yaml.load(stream, Loader=Loader)
    参数:
    stream:待读取文件对象

        示例:
            import yaml
            with open("../Data/search_page.yaml",'r') as f:
                data = yaml.load(f)
                print(type(data)) # 打印data类型
                print(data) # 打印data返回值
        执行结果:
            <class 'dict'>
            {'Search_Data': {
                  'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'}, 
                  'search_test_001': {'expect': [4, 5, 6], 'value': 456}
          }
       } 案例2:写入yaml 写入yaml文件内容 {
'Search_Data':   {   'search_test_002':   {     'expect':       {'value': '你好'}, 'value': '你好'},   'search_test_001':       {'expect': [4, 5, 6], 'value': 456}   } } 写yaml文件 方法:yaml.dump(data,stream,**kwds) 参数: data:写入数据类型为字典 stream:打开文件对象 encoding='utf-8' # 设置写入编码格式 allow_unicode=True # 是否允许unicode编码

写入示例1:不设置编码格式 import yaml data = {'Search_Data': { 'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'}, 'search_test_001': {'expect': [4, 5, 6], 'value': 456}}} with open("./text.yaml","w") as f: # 在当前目录下生成text.yaml文件,若文件存在直接更新内容 yaml.dump(data,f) 执行结果: 1.当前目录生成text.yaml文件 2.文件内容: Search_Data: search_test_001: expect: [4, 5, 6] value: 456 search_test_002: expect: {value: "\u4F60\u597D"} # 中文出现乱码 value: "\u4F60\u597D" # 中文出现乱码 写入示例2:设置编码格式 import yaml data = {'Search_Data': { 'search_test_002': {'expect': {'value': '你好'}, 'value': '你好'}, 'search_test_001': {'expect': [4, 5, 6], 'value': 456}}} with open("./text.yaml","w") as f: # 在当前目录下生成text.yaml文件,若文件存在直接更新内容 yaml.dump(data,f,encoding='utf-8',allow_unicode=True) 执行结果: 1.当前目录生成text.yaml文件 2.文件内容: Search_Data: search_test_001: expect: [4, 5, 6] value: 456 search_test_002: expect: {value: 你好} # 中文未出现乱码 value: 你好 # 中文未出现乱码
posted @ 2020-01-09 11:18  为你编程  阅读(189)  评论(0编辑  收藏  举报