YAML
是一种人性化的数据序列化格式,使用空格缩进表示层级关系,相比 JSON
更具可读性。Python
中使用 PyYAML
库可以方便地解析和生成 YAML
格式数据。本文将详细介绍 PyYAML
的用法。
YAML格式
YAML
的格式主要有以下几点特征
- 使用空格表示层级关系
- 使用冒号
:
表示键值对 - 使用
-
表示数组项 - 支持多行字符串
- 支持数据类型:数字、布尔值、字符串、数组、字典
下面看个示例
name: John Smith
age: 20
gender: male
interests:
- Reading
- Sports
- Programming
PyYAML的用法
PyYAML
提供了 yaml.load()
和 yaml.dump()
方法分别实现 YAML
的解析和生成。
在使用之前,需要安装下,使用命令 pip install -U pyyaml
即可。
解析YAML
import yaml
with open('data.yaml') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
print(data['name'])
生成YAML
import yaml
data = {
'name': 'John Smith',
'age': 20,
'interests': [
'Reading',
'Sports'
]
}
with open('data.yaml', 'w') as f:
yaml.dump(data, f)
加载配置文件
PyYAML
可用于加载配置文件,示例代码如下
import yaml
with open('config.yaml') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
print(config['database']['host'])
其中的测试文件 config.yaml
内容如下
database:
host: 127.0.0.1
port: 3306
username: root
password: xxx
解析命令行YAML输入
解析用户命令行中的 YAML
输入
import sys
import yaml
if len(sys.argv) < 2:
print("命令行参数不匹配")
sys.exit(1)
yaml_string = sys.argv[1]
data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(data)
然后,执行脚本时,带上字符串参数,如 python test.py "name: xugaoxiang"
这时候,终端的输出是
{'name': 'xugaoxiang'}
PyYAML的高级用法
控制加载方式
PyYAML
在加载 YAML
时支持多种方式,分别是
FullLoader
: 全量加载YAML
,将所有字符串转换为Python
对象SafeLoader
: 安全加载,不会构造任意Python
对象BaseLoader
: 简单加载,只解析YAML
文档结构,不转换字符串
看下面的代码示例
import yaml
data = '''
a: 1
b:
c: 3
'''
# 全量加载
yaml.load(data, Loader=yaml.FullLoader)
# 安全加载
yaml.load(data, Loader=yaml.SafeLoader)
# 简单加载
yaml.load(data, Loader=yaml.BaseLoader)
dump参数
生成 YAML
时,yaml.dump()
支持多种参数控制输出
default_flow_style=False
: 不使用流样式生成YAML
,流样式,即方括号[]表示列表,花括号{}表示字典allow_unicode=True
: 允许输出Unicode
字符indent=4
: 缩进空格数
示例
yaml.dump(data, stream, default_flow_style=False, allow_unicode=True, indent=4)
自定义对象导出
通过为对象定义 __repr__
方法可以自定义其 YAML
序列化
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'{self.name} - {self.age}'
p = Person('John', 20)
print(yaml.dump(p))
上述代码输出
!!python/object:__main__.Person
age: 20
name: John
这就位我们提供了对 YAML
序列化的更细粒度的控制。
总结
PyYAML
库为 Python
提供了完整的 YAML
处理能力,使用它可以方便地读写 YAML
文档,也可用于配置文件解析等场景。当需要人性化的数据序列化格式时,PyYAML
将是很好的选择。