Python YAML文件的读写操作详解

Luna
Luna
发布时间:2026-10-16 | 2人浏览过
原创

本文详细介绍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相关内容,建议查阅本站过往文章或继续浏览后续教程,感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表