欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

原来Python解析YAML如此轻松

Python 迷途小书童 1年前 (2023-08-26) 645次浏览 0个评论

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 将是很好的选择。

喜欢 (0)

您必须 登录 才能发表评论!