Answers:
不依赖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,如本答案中所述。
pip install pyyaml
,看到这个帖子了更多的选择stackoverflow.com/questions/14261614/...
# -*- 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中的配置文件》。
€
在Windows上的输出是€
。有人知道原因吗?
io.open(doc_name, 'r', encoding='utf8')
以读取特殊字符。YAML版本0.1.7
open(doc_name, ..., encodung='utf8')
读写功能,而无需导入io
。
如果您具有符合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)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
)的文档问题。我尝试将yaml.encoding设置为utf-8,但由于YAML中的加载方法仍使用ascii_decode而无法正常工作。这是错误吗?
首先使用pip3安装pyyaml。
然后导入yaml模块并将文件加载到名为“ my_dict”的字典中:
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
这就是您所需要的。现在,整个yaml文件都在“ my_dict”字典中。
!!python
),则使用它也可能是不安全的(例如在完整的硬盘擦除后)yaml.load()
。正如明确记录的那样,您应该在此处重复该警告(几乎yaml.safe_load()
可以使用所有情况)。
import yaml
,但这不是内置模块,也没有指定它是哪个软件包。import yaml
在全新的Python3安装上运行,结果是ModuleNotFoundError: No module named 'yaml'
例:
defaults.yaml
url: https://www.google.com
环境
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
我使用ruamel.yaml。详情和辩论在这里。
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
用法ruamel.yaml是PyYAML的旧惯例兼容(有一些简单的可解决的问题),并因为它是在链接说明我公司提供,使用
from ruamel import yaml
代替
import yaml
它将解决您的大多数问题。
编辑:事实证明PyYAML并没有死,它只是保存在另一个地方。
#!/usr/bin/env python
import sys
import yaml
def main(argv):
with open(argv[0]) as stream:
try:
#print(yaml.load(stream))
return 0
except yaml.YAMLError as exc:
print(exc)
return 1
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
yaml.safe_load
它,因为它无法执行YAML文件中的任意代码。