不依赖 C 标头的最简单,最纯净的方法是 PyYaml(文档),可以通过pip install pyyaml
:
#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
就是这样。普通的yaml.load()
函数也存在,但是yaml.safe_load()
始终是首选,除非您明确需要提供的任意对象序列化 / 反序列化,以避免引入执行任意代码的可能性。
请注意,PyYaml 项目支持YAML 1.1 规范之前的版本。如果需要YAML 1.2 规范支持,请参见ruamel.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)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
和.yaml
对于您的应用程序,以下内容可能很重要:
另请参阅: 数据序列化格式的比较
如果您想寻找一种制作配置文件的方法,则可能需要阅读我的短文《 Python 中的配置文件》。
如果您具有符合YAML 1.2 规范(2009 年发布)的 YAML,则应使用 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)