一、PyYAML介绍
以下介绍为chatgpt生成。
PyYAML 是一个用于解析和生成 YAML 数据的 Python 库。它提供了简单易用的接口,用于读取和写入 YAML 格式的文件、字符串或流。
以下是一些关于 PyYAML 的重要特点和功能:
- 解析和生成:PyYAML 支持将 YAML 数据解析为 Python 对象,并且可以将 Python 对象转换为 YAML 格式。
- 支持标准:PyYAML 实现了 YAML 1.1 规范,兼容大多数 YAML 实现。它支持常见的 YAML 特性,如标量、映射、序列、锚点引用等。
- 安全加载:PyYAML 提供了 SafeLoader,它是一个相对较安全的加载器,用于加载 YAML 数据时限制执行的操作,以降低潜在的安全风险。
- 高级加载器:除了 SafeLoader,PyYAML 还提供了 Loader,它是一个更灵活的加载器,支持加载自定义类型和构造函数。
- 写入和流:PyYAML 可以将 Python 对象转换为 YAML 格式的字符串,并且可以将 YAML 数据流写入文件或流。
- 自定义类型:PyYAML 允许注册和使用自定义类型和构造函数,以支持特定的对象序列化和反序列化需求。
- 扩展性:PyYAML 提供了灵活的 API,允许你根据需要进行自定义扩展,例如添加标签处理程序、构造函数和序列化器等。
使用 PyYAML,你可以轻松地在 Python 中处理 YAML 数据,无论是读取和解析现有的 YAML 文件,还是将数据转换为 YAML 格式并进行写入。这使得 PyYAML 成为处理配置文件、数据交换、持久化存储等场景中的有用工具。
以下是一个简单示例,展示了如何使用 PyYAML 加载和保存 YAML 文件:
import yaml
# 加载 YAML 文件
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
# 修改配置数据
config['database']['host'] = 'localhost'
config['database']['port'] = 3306
# 保存配置到 YAML 文件
with open('config.yaml', 'w') as file:
yaml.dump(config, file)
在上述示例中,我们首先使用 safe_load 函数加载 YAML 文件。然后,我们对配置数据进行修改,并使用 dump 函数将修改后的数据保存回 YAML 文件。
总的来说,PyYAML 提供了一种简单和方便的方式来处理 YAML 数据,并与 Python 的数据类型和对象进行交互。
二、YAML 标量、映射、序列
在YAML中,有3种基本的数据结构:Scalars(标量)、Sequences(序列)和Mappings(映射)。它们用于构建和表示复杂的数据。
标量(Scalars)
标量是单个的、不可再分的值。标量可以是字符串、数字、布尔值、null、日期等。下面是一些标量数据类型的例子:
boolean:
- TRUE #true, True都可以
- FALSE #false, False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null: ~ #使用~或者null表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行, 每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式, 即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式, 时间和日期之间使用T连接, 最后使用+代表时区
对于多行字符串标量,YAML有多种表示方式:
1、普通样式、单/双引号样式(plain, single-quoted, double-quoted)
lines: line1
line2
line3
line4
line5
lines: 'line1
line2
line3
line4
line5'
转换为python对象:
{'lines': 'line1 line2 line3\nline4 line5'}
转换时,去掉缩进,换行->空格,空行->换行。
2、字面样式(literal )
lines: |
line1
line2
line3
line4
line5
转换为python对象:
{'lines': 'line1\n line2\nline3\n\nline4\nline5\n'}
转换时,保留缩进和换行
3、折叠样式(folded)
lines: >
line1
line2
line3
line4
line5
转换为python对象:
{'lines': 'line1\n line2\nline3\nline4 line5\n'}
转换时,保留缩进和换行。但相邻、无缩进的两个非空行,会合并成一行,并用一个空格字符分隔。
4、如果是序列中的元素表示多行字符串,请用以下格式:
- >
line1
序列(Sequences)
序列是一组按次序排列的值,每一个元素都可以是任意数据类型。
以连字符-
开头的行构成一个序列:
- A
- B
- C
序列的行内表示:
key: [value1, value2, ...]
映射(Mappings)
映射是一种键值对的集合,其中每个键都必须唯一。
每个键值对用冒号+一个空格分隔(key: value
)
key:
child_key