Python解析Yaml配置文件

Python解析Yaml配置文件

    • 1、Yaml模块
    • 2、Yaml基本语法
    • 3、Python处理Yaml文件

      1、Yaml模块

      Yaml不是一种标记语言,而是一种易读的序列化语言

      Yaml通常被用作配置文件,后缀是.yaml或.yml;主要用于数据存储与传输

      Python的PyYaml模块是Python的Yaml解析器和生成器

      安装:

      pip install pyyaml
      
      import yaml
      # Python处理Yaml文件的方法
      from yaml import load, dump
      # LibYAML的解析器和生成器:CParser和CEmitter类
      from yaml import CLoader, CDumper
      

      YAML加载器类型:

      '''
      BaseLoader:仅加载最基本的YAML
      SafeLoader:安全地加载YAML语言的子集,用于加载不受信任的输入(safe_load)
      FullLoader(默认):加载完整YAML语言,避免任意代码执行(full_load)
      UnsafeLoader:也称为Loader向后兼容性,原始的Loader代码,不受信任的数据可能通过这种方式执行其他有危害的代码
      '''
      

      2、Yaml基本语法

      1) Yaml支持的数据类型:

      • 对象:键值对的集合
      • 数组
      • 纯量(Scalars)

        2) Yaml的基本语法

        • 大小写敏感
        • 使用缩进表示层级关系
        • 字符串不使用引号包裹
        • 对象通过:表示
        • 列表通过-表示
        • 注释通过#表示

          3、Python处理Yaml文件

          """
          load(doc/stream, Loader):用于将YAML文档反序列化转化成Python对象
          load_all(doc/stream, Loader):用于解析多个YAML文档,返回包含所有反序列化后的YAML文档的生成器对象
          """
          
          '''
          dump(data, stream, Dumper):用于将Python对象转换成一个YAML文档,若无其他参数,直接返回生成的YAML文档
          dump_all(data, stream, Dumper):用于将Python对象转换成多个YAML文档
          '''
          

          1) 基本使用:load()、dump()

          doc = """
          a: 1
          b:
            c: 2
            d: 3
          """
          print(yaml.load(doc, Loader=CLoader))     # {'a': 1, 'b': {'c': 2, 'd': 3}}
          print(yaml.dump(yaml.load(doc, Loader=CLoader)))
          '''
          a: 1
          b:
            c: 2
            d: 3
          '''
          # test.yaml内容同上面doc
          with open('test.yaml', 'r', encoding='utf-8') as f:
              print(yaml.load(f, Loader=CLoader))   # {'a': 1, 'b': {'c': 2, 'd': 3}}
          with open('test_write.yaml', 'w', encoding='utf-8') as f:
              yaml.dump(doc, f, Dumper=CDumper)     # {'a': 1, 'b': {'c': 2, 'd': 3}}
          

          2) load_all()、dump_all()

          doc = """
          name: Tom
          age: 18
          ---
          name: Jerry
          age: 17
          """
          datas = yaml.load_all(doc, Loader=CLoader)
          for data in datas:
              print(data)
          '''
          {'name': 'Tom', 'age': 18}
          {'name': 'Jerry', 'age': 17}
          '''
          with open('test_write.yaml', 'w', encoding='utf-8') as f:
              yaml.dump_all(doc, f, Dumper=CDumper)
          

          3) 复杂Yaml文档解析

          doc = """
          - A: 1
            a: 2
          - B: 3
            b: 4
          """
          datas = yaml.load(doc, Loader=CLoader)
          print(datas)
          '''
          [{'A': 1, 'a': 2}, {'B': 3, 'b': 4}]
          '''
          
          doc = """
          name:
           - A1
           - B2
           - C3
          age: 20
          addrs:
            addr1: M
            addr2: N
          """
          datas = yaml.load(doc, Loader=CLoader)
          print(datas)
          '''
          {'name': ['A1', 'B2', 'C3'], 'age': 20, 'addrs': {'addr1': 'M', 'addr2': 'N'}}
          '''
          with open('test_write.yaml', 'w', encoding='utf-8') as f:
              yaml.dump_all(doc, f, Dumper=CDumper)