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)