Python解析Yaml配置文件

时间:2025-04-04 20:58:09

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)