Python YAML文件的读写操作详解
本文详细介绍Python中YAML文件的读写方法,对比PyYAML与ruamel.yaml模块的使用场景。涵盖YAML基础语法、数据类型、文件规则,以及load、dump等核心函数的具体操作与代码示例,帮助开发者高效处理YAML数据。
YAML是一种专为人类阅读优化的数据序列化格式,能够轻松与脚本语言进行交互。它广泛应用于配置文件编写、数据存储以及数据交换传输等场景。
YAML格式
YAML主要包含三种基本数据类型:
1. 标量(Scalar):包括字符串、整数、浮点数以及日期类型。
- 布尔值可以用“true”、“True”、“TRUE”、“yes”、“Yes”、“YES”表示真,用“false”、“False”、“FALSE”、“no”、“No”、“NO”表示假。
- 空值可以使用null、Null、
~表示,或者直接不指定任何值。
2. 数组(Sequence):使用前导符号-表示,且符号与具体值之间必须保留一个空格。
3. 对象(Mapping):由键值对集合组成,键与值之间使用冒号加空格: 进行分隔。
YAML文件
编写YAML文件时需遵循以下基本规则:
YAML语法严格区分大小写。
利用缩进层级来表示数据的嵌套关系:
- 缩进必须使用空格字符,严禁使用Tab键。
- 处于同一层级的元素必须保持左对齐。
普通字符串无需使用引号包裹,但若字符串包含空格、冒号等特殊字符,则必须使用引号括起。
使用#符号进行单行注释。
同一个YAML文件中可以包含多个独立的YAML文档:
使用---(即三个连字符)来标记一个新文档的开始。
[可选] 使用...(即三个句点)来标记一个文档的结束。
--- # 这是第一份文档 one: 1 # 其他内容... ...
--- # 这是第二份文档 two: 2 # 其他内容...
YAML操作
在Python生态中,处理YAML主要涉及两个模块:PyYAML和ruamel.yaml(安装命令分别为pip3 install pyyaml和pip3 install ruamel.yaml)。
读取
使用load函数可以便捷地加载文档内容,解析后的结果可能是字典、列表或None(空)。
import yaml
def readYaml(file): # -> Union[dict, list, None]:
with open(file, 'r', encoding='utf-8') as f:
return yaml.load(f, yaml.Loader)若文件中包含多个文档,应使用load_all函数进行加载;该函数返回一个生成器对象,需要遍历以逐个获取每个文档的内容。
def readAllDoc(file) -> list:
with open(file, 'r', encoding='utf-8') as f:
docs = yaml.load_all(f, yaml.Loader)
# return [d for d in docs]
return list(docs)存储
标准的yaml.dump()方法不会自动将列表或字典转换为符合YAML标准的格式。若需生成标准的YAML文档,建议使用ruamel.yaml模块。
import ruamel.yaml
def createYaml(file, data: dict):
with open(file, 'w', encoding='utf-8') as f:
writer = ruamel.yaml.YAML()
writer.indent(mapping=2, sequence=4, offset=2)
writer.dump(data, f)通过dump_all函数可以将列表中的每个元素分别序列化为独立的文档。
def createAllDoc(file, data: list):
with open(file, 'w', encoding='utf-8') as f:
writer = ruamel.yaml.YAML()
writer.indent(mapping=2, sequence=4, offset=2)
writer.dump_all(data, f)示例数据[{'name': 'Mike', 'age': 12}, {'name': 'luce', 'age': 15}]被序列化。
使用dump生成的包含数组元素的YAML文件内容如下:
- name: Mike
age: 12
- name: luce
age: 15
使用dump_all生成的YAML文件内容如下(包含两个独立文档):
name: Mike
age: 12
---
name: luce
age: 15示例
YAML文件读取后,其数据结构通常表现为列表或字典。
转字典
当读取的YAML内容对应为一个字典时:
name: mike
age: 25
score: 80.5
解析返回的具体值为:
{ "name": "mike", "age": 25, "score": 80.5 }
在获取字典中的具体值时,建议先判断键是否存在,然后再进行读取操作。
if 'name' in data:
print(data['name'])
转列表
当读取的YAML内容对应为一个列表时:
- name: mike
age: 24
- name: tom
age: 30
解析返回的具体值为:
[ { "name": "mike", "age": 24 }, { "name": "tom", "age": 30 } ]
本文介绍了Python中YAML文件读写的基本操作。如需了解更多Python YAML相关内容,建议查阅本站过往文章或继续浏览后续教程,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









