如何在Python中解析YAML文件
我怎么在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
其他选择
- CSV:超级简单的格式(读取和写入)
- JSON:适合写人类可读的数据;非常常用(读取和写入)
- YAML:YAML是JSON的超集,但更容易阅读(读取和写入, JSON和YAML的比较)
- pickle:一种Python序列化格式(读取和写入)⚠️ 使用pickle处理来自第三方的文件存在无法控制的任意代码执行风险。
- MessagePack(Python包):更紧凑的表示方式(读取和写入)
- HDF5(Python包):适合处理矩阵(读取和写入)
- XML:也存在 *叹气*(读取 和 写入)
对于你的应用,以下几点可能很重要:
- 其他编程语言的支持
- 读取/写入性能
- 紧凑性(文件大小)
另见: 数据序列化格式比较
如果你想找的是制作配置文件的方法,可以看看我写的短文 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 的安全性。