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
'''
# 内容同上面doc
with open('', '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)