YAML 文件处理
大家好!这个章节我们将学习如何在 Python 中处理 YAML 文件。YAML 是一种非常直观、易于阅读的数据格式,广泛用于配置文件和数据交换。它有点类似于 JSON,但它的语法更简洁、清晰,因此被很多开发者用来代替 JSON 处理配置数据。就像你整理笔记时,使用了清晰的标题和缩进来区分层次,YAML 也通过缩进来表达数据的层级结构。
简介
YAML 全称其实是 YAML Ain't a Markup Language(YAML 不是一种标记语言)的递归缩写,所以它强调的是数据本身,而不是以标记为重点。
YAML 是一种可读性非常高,与程序语言数据结构非常接近。同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言。
YAML 其实是 "YAML Ain't a Markup Language" 的递归缩写,意思是“YAML 不是一种标记语言”。它强调的是数据的表达,而不是通过标签来表示文档结构。YAML 具有很高的可读性,同时它的格式也非常贴近程序语言的数据结构。比如,它支持字典、列表和基本数据类型,让人非常容易理解。
为什么要使用 YAML 文件
其实 YAML 文件也是一种配置文件,但是相较于 ini,conf 配置文件来说,更加的简洁,操作简单,还能存放不同类型的数据,而像 ini 存储的值就都是字符串类型,读取之后还要手动转换。
YAML 作为配置文件格式,和传统的 .ini 或 .conf 文件相比,有着更简洁和更强大的表达能力。特别是 YAML 支持不同类型的数据存储,而不像 ini 文件那样只能存储字符串。它的简单语法使得它更适合处理复杂的配置和数据结构。你可以把它想象成一张有层级的表格,配置项有多个子配置,易于管理。
YAML 的基本语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用
Tab键,只允许使用空格。(可以将你的 IDE 的tab按键输出替换成4个空格) - 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#表示注释
YAML 文件的语法规则非常简单,但需要注意一些细节。首先,YAML 是大小写敏感的;其次,YAML 使用缩进表示层级关系,但一定要使用空格,而不是 Tab 键,这一点非常重要。你可以设置 IDE 自动将 Tab 转换为 4 个空格来保持一致性。另外,YAML 允许你在文件中写注释,注释部分以 # 开头,不会影响数据的解析。
YAML 的数据结构
- 对象:键值对的集合,又称为映射
mapping/ 哈希hashes/ 字典dictionary - 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量
scalars:单个的、不可再分的值
YAML 中的主要数据结构包括对象、数组和纯量类型。对象就是一组键值对,类似于 Python 的字典;数组是一系列有序的元素,类似于 Python 的列表;而纯量类型是最基本的值,比如字符串、整数、布尔值等。
对象类型
对象的一组键值对,使用冒号结构表示,会转换成 Python 中的字典。
YAML:
animals: dog
Python:
{'animals': 'dog'}
YAML 中的对象类型是由一组键值对组成的。它的表示方法和 Python 字典非常类似。比如,如果你想表示一只动物是“dog”,你可以用下面的 YAML 语法。这和 Python 字典中的形式非常类似。
YAML:
person: { name: Tom, age: 20, gender: male }
Python:
{'person': {'name': 'Tom', 'age': 20, 'gender': 'male'}}
YAML 中的对象还可以嵌套。例如,表示一个人的信息时,可以用这种格式。它在 Python 中对应的是字典的嵌套结构。可以看到,YAML 采用了简洁的语法,甚至连 {} 都可以省略,用空格表示嵌套关系。
数组类型
数组类型使用 - 为前缀,每个元素独占一行,通过缩进关系表示层级包含关系,会转换成 Python 中的列表。
数组类型在 YAML 中使用 - 来表示每个元素,元素之间通过换行分开。每个元素都会按缩进层级排列,这和 Python 的列表非常类似。
YAML:
- one
- two
- three
- four
- five
Python:
['one', 'two', 'three', 'four', 'five']
比如,表示一个包含多个元素的数组可以这样来表示。在 Python 中,它会转换成列表。
YAML:
- - 1
- 2
- 3
- - 4
- 5
- 6
Python:
[[1, 2, 3], [4, 5, 6]]
YAML 中的数组也可以是嵌套数组。比如,如果我们想表示一个二维数组。它会转换成 Python 中的列表嵌套格式。
纯量类型
纯量类型是最基本的、不可再分的值;类似基本数据类型。
- 字符串: 不需要使用双引号包裹
- 布尔值:
true、True、false、False都可以 - 整数
- 浮点数
- 时间,时间使用
ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 - 日期,日期必须使用
ISO 8601格式,即yyyy-MM-dd - Null:
~表示Null
纯量类型是 YAML 中的基本数据类型。它包括字符串、布尔值、数字、日期和时间等。YAML 对字符串的处理非常灵活,可以不加引号表示字符串,布尔值可以是 true 或 false,并且 YAML 支持 ISO 8601 格式的日期和时间。
YAML:
int: 12
float: 12.3
string: pets
bool: true
None: null
time: 2001-12-14t21:59:43.10-05:00
date: 2018-03-21
Python:
{
'int': 12,
'float': 12.3,
'string': 'pets',
'bool': True,
'None': None,
'time': datetime.datetime(2001, 12, 14, 21, 59, 43, 100000, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=68400))),
'date': datetime.date(2018, 3, 21)
}
例如,YAML 中的纯量类型可以这样来表示。对应的 Python 对象是就是一个字典。这里要注意,日期和时间是用 ISO 8601 格式表示的,可以带有时区信息。
复杂结构
YAML:
cool_list:
- 10
- 15
- 12
hard_list:
- { key: value }
- [1, 2, 3]
- test:
- 1
- 2
- 3
twice_list:
- - { a: AA }
- { b: BB }
- { c: CC }
Python:
{
'cool_list': [10, 15, 12],
'hard_list': [
{'key': 'value'},
[1, 2, 3],
{
'test': [1, 2, 3]
}
],
'twice_list':[
[
{'a': 'AA'},
{'b': 'BB'},
{'c': 'CC'}
]
]
}
YAML 可以嵌套复杂的结构,包括嵌套数组、字典等。你可以非常灵活地组织数据。例如,这里的 YAML 描述了一个复杂的数据结构。这会转换成 Python 中的复杂字典和列表结构。
Tips:有
:后面的内容就解析成字典,有-后面的内容就解析成列表的元素
可以看到,YAML 通过缩进和符号 -、: 来表示嵌套的结构,表达方式非常简洁。
YAML 文件处理
Python 中,可以使用第三方模块 PyYAML 来处理 YAML 文件。
在 Python 中,我们使用 PyYAML 库来处理 YAML 文件。它允许我们方便地读取和写入 YAML 文件。接下来,我们来看看如何在 Python 中使用 PyYAML 来处理 YAML 文件。
安装 PyYAML 模块
pip install pyyaml
首先,我们需要安装 PyYAML 模块。你可以通过 pip install pyyaml 命令进行安装。
读取 YAML 文件
YAML 模块使用 safe_load() 方法读取 yaml 文件,在读取文件之前,和普通文件一样,需要先将文件打开。
import yaml
# 读取 YAML 文件, 以前面复杂结果数据为例
with open('data.yaml', 'r') as file:
data = yaml.safe_load(file)
# 处理读取到的数据
print(data['cool_list'])
print(data['hard_list'][2]['test'])
要读取 YAML 文件,我们使用 yaml.safe_load() 方法。这就像普通的文件操作一样,首先打开文件,然后使用 safe_load() 读取内容。比如,读取一个包含复杂结构数据的文件。在这个例子中,我们读取了一个 YAML 文件,解析并访问其中的数据。
写入 YAML 文件
YAML 模块使用 safe_dump() 方法向 yaml 文件中写入数据,在写入文件之前,也需要先将文件打开。
import yaml
# 要写入的数据
data = {
'key1': 'value1',
'key2': 'value2',
'key3': {
'key4': 'value4'
}
}
# 写入 YAML 文件
with open('output.yaml', 'w') as file:
yaml.safe_dump(data, file)
同样地,向 YAML 文件写入数据时,我们使用 yaml.safe_dump() 方法。比如,将字典数据保存为 YAML 格式。在这里,我们将一个字典数据写入 output.yaml 文件,保存为 YAML 格式。
总结
- YAML 的基本语法规则
- YAML 的数据结构
- 纯量类型
- 复杂结构
- YAML 文件处理
最后来总结一下。这一章节介绍了 YAML 的基本语法规则、数据结构及其在 Python 中的应用。我们还学习了如何使用 PyYAML 模块处理 YAML 文件,包括如何读取和写入数据。掌握了这些,你就能轻松地在 Python 项目中使用 YAML 进行配置和数据交换了。