如何在Python中解析YAML文件

1090 投票
10 回答
1346201 浏览
提问于 2025-04-15 16:13

我怎么在Python中解析一个YAML文件呢?

10 个回答

86

如果你的YAML文件符合YAML 1.2规范(这是2009年发布的),那么你应该使用ruamel.yaml(顺便说一下,我是这个包的作者)。这个库基本上是PyYAML的一个扩展,支持大部分YAML 1.1(这是2005年的版本)。

如果你想在读写文件时保留你的注释,使用ruamel.yaml绝对是个好主意。

升级@Jon的例子很简单:

import ruamel.yaml as yaml

with open("example.yaml") as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

使用safe_load(),除非你对输入有完全的控制,确实需要这样做(这种情况很少见),并且你知道自己在做什么。

如果你在处理文件时使用的是pathlib的Path,那么使用ruamel.yaml提供的新API会更好:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
229

用Python 2和3(以及Unicode)读取和写入YAML文件

# -*- coding: utf-8 -*-
import yaml
import io

# Define data
data = {
    'a list': [
        1, 
        42, 
        3.141, 
        1337, 
        'help', 
        u'€'
    ],
    'a string': 'bla',
    'another dict': {
        'foo': 'bar',
        'key': 'value',
        'the answer': 42
    }
}

# Write YAML file
with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)

# Read YAML file
with open("data.yaml", 'r') as stream:
    data_loaded = yaml.safe_load(stream)

print(data == data_loaded)

创建的YAML文件

a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42

常见文件后缀

.yml.yaml

其他选择

对于你的应用,以下几点可能很重要:

  • 其他编程语言的支持
  • 读取/写入性能
  • 紧凑性(文件大小)

另见: 数据序列化格式比较

如果你想找的是制作配置文件的方法,可以看看我写的短文 Python中的配置文件

1424

最简单、最纯粹的方法是使用 PyYaml,这个库不依赖于 C 语言的头文件。你可以通过pip install pyyaml来安装它,网址是这里

import yaml

with open("example.yaml") as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

就这么简单。还有一个叫 yaml.load() 的函数,但我们应该总是使用 yaml.safe_load(),这样可以避免引入执行任意代码的风险。所以,除非你确实需要处理任意对象的序列化和反序列化,否则就用 safe_load

需要注意的是,PyYaml 项目支持到 YAML 1.1 规范。如果你需要支持 YAML 1.2 规范,可以查看ruamel.yaml,这个在这个回答中提到过。

另外,你还可以使用一个替代品,叫做 oyaml,它可以保持你的 YAML 文件的顺序和你原来的一样。你可以在这里查看 oyaml 的安全性

撰写回答