【Python】PyYAML库介绍及用法

目录

PyYAML库,import yaml

1、什么是yaml数据

2、YAML应用场景

3、PyYAML库-三方库

PyYAML库,import yaml

1、什么是yaml数据

YAML,全称是"YAML Ain't a Markup Language"(YAML 不是一种标记语言),是一种人类可读的数据序列化标准格式。它通常用于配置文件、数据交换等需求中。

YAML的设计目标是,数据结构易于理解,对人类友好,容易配对语言之间流通使用,且支持一次性dump(转储),然后又能一次性导入到程序里。

YAML数据通常使用.yml或.yaml为文件扩展名。一份YAML文件可能包含基本类型(数字,字符串,布尔型),数据集合(数组,列表),以及关联数组(哈希表,字典)

一个YAML数据的简单示例:

name: John Smith
age: 30
married: true
children:
  - name: Alice Smith
    age: 5
  - name: Bob Smith
    age: 7

在这段YAML数据中,我们定义了一个名为"John Smith"的人,他30岁,已婚,并且有两个孩子。

YAML的特点在于其良好的可读性和兼容性。你会发现YAML比XML或JSON更容易阅读和编辑,还能更好地和各种语言兼容。

2、YAML应用场景

Python中的YAML主要用于以下几种场景:

  1. 配置文件: YAML格式易读易写,人类友好,因此经常作为各种应用和工具的配置文件。例如,很多Python web框架(如Flask,Django)的配置文件就可以使用YAML编写。
  2. 数据序列化: YAML可以表示除基础的数字/字符串/布尔值等类型外,还可以表示列表、字典等复杂结构,因此适合作为数据序列化的格式。一些Python项目中,可能会将内存中的数据序列化成YAML格式,保存到文件或者数据库中,以便于后续恢复使用。
  3. 数据交换: YAML是一种通用的数据格式,可以跨语言使用,Python有成熟的YAML库支持,因此在进行跨语言的数据交换时,也会使用YAML这种格式。例如,一个Python程序和一个Ruby程序之间的数据交换,就可以使用YAML格式。
  4. 测试: 在一些测试场景中,测试用例数据利用YAML格式进行管理。因为YAML格式方便编写和阅读,有助于提高测试数据的维护效率。
  5. CI/CD脚本: 许多CI/CD(持续集成和持续部署)工具(如Travis CI,GitLab CI,Jenkins等)的脚本就是用YAML格式编写的。
  6. 容器编排: 例如 Kubernetes(K8s)官方推荐的编排文件就是使用YAML编写的。

以上就是在Python中使用YAML的一些常见场景。

3、PyYAML库-三方库

Python中的PyYAML库是一个用于解析和生成YAML数据的库。

YAML,即“YAML Ain't a Markup Language”(YAML不是一种标记语言),是一种易于阅读、适合表示层次和关联数据的可读数据序列化标准格式。

下面是如何安装和使用PyYAML的一些基本示例:

安装PyYAML库

可以使用pip在Python环境中安装PyYAML:

使用PyYAML库

PyYAML的主要功能函数是yaml.load(解析YAML数据)和yaml.dump(生成YAML数据)

pip install pyyaml
import yaml

# 解析YAML数据
data = yaml.load("""
- foo
- bar
- baz
""", Loader=yaml.FullLoader)
print(data)  # 输出:['foo', 'bar', 'baz']

# 生成YAML数据
data = {"foo": "bar", "baz": "qux"}
print(yaml.dump(data))  
# 输出:
# foo: bar
# baz: qux

注意:从PyYAML 5.1开始,默认的加载函数yaml.load(input)已经被废弃,为了安全解析YAML文件,推荐使用yaml.safe_load(input)或yaml.load(input, Loader=yaml.FullLoader)。

在处理YAML数据时,还需要注意YAML是区分大小写和缩进的,同样的,在PyYAML中也遵循这些规则。

以下是一些主要的方法:

  • yaml.load(stream, Loader=None): 将一个YAML文档从流中加载并产生一个Python对象。stream可以是一个字符串、一个文件对象或者一个字节流。
  • yaml.safe_load(stream): 这个函数和yaml.load()函数类似,但只能加载"安全的"YAML。这可以防止执行任何不安全的构造函数。推荐在处理不受信任的输入时使用此函数。
  • yaml.full_load(stream): 如果你不需要任何安全性, 但需要加载所有YAML 1.1的构造函数(日期、复数、任意精度等类型),可以使用此函数。
  • yaml.dump(data, stream=None, **kwds): 将一个Python对象序列化为一个YAML文档并写入一个流。如果stream为None,则把生成的YAML文档作为字符串返回。
  • yaml.safe_dump(data, stream=None, **kwds): 与dump()函数类似,但只能处理安全的Python对象,例如不能序列化Python的函数和类。
  • yaml.load_all(stream, Loader=None): 从一个流中加载所有的YAML文档并为每个文档生成一个Python对象。返回一个生成器,可以遍历产生的对象。
  • yaml.dump_all(documents, stream=None, **kwds): 将一系列Python对象序列化为YAML文档并写入一个流。如果stream为None,则把生成的YAML文档作为字符串返回。

此外,PyYAML还提供了一些方法方便自定义和扩展,例如定义自己的构造函数和表示函数,设置输出样式等。

以下是一些在Python中使用PyYAML库的示例:

加载YAML

你可以使用yaml.load函数(或者安全的yaml.safe_load函数)从字符串或者文件中读取YAML数据:

import yaml

# YAML字符串
yaml_string = """
name: John Smith
age: 30
married: true
children:
  - name: Alice Smith
    age: 5
  - name: Bob Smith
    age: 7
"""

data = yaml.safe_load(yaml_string)

print(data["name"])  # 输出:John Smith
print(data["children"][0]["name"])  # 输出:Alice Smith

写入YAML

你可以使用yaml.dump函数(或者安全的yaml.safe_dump函数)将Python对象转储为YAML格式的字符串,或者写入文件:

import yaml

data = {
    "name": "John Smith",
    "age": 30,
    "married": True,
    "children": [
        {"name": "Alice Smith", "age": 5},
        {"name": "Bob Smith", "age": 7},
    ]
}

yaml_data = yaml.dump(data)
print(yaml_data)
# 输出:
# name: John Smith
# age: 30
# married: true
# children:
#   - name: Alice Smith
#     age: 5
#   - name: Bob Smith
#     age: 7

加载多个YAML文档

有时候一个YAML文件中可能包含多个YAML文档,你可以使用yaml.safe_load_all函数一次性加载所有的文档:

import yaml

yaml_string = """
---
name: John
age: 30
---
name: Alice
age: 20
"""

documents = yaml.safe_load_all(yaml_string)

for doc in documents:
    print("---")
    print(doc)

在这个例子中,---是用来分隔多个YAML文档的标记。

你可能感兴趣的:(python,python)