如何在Python中解析YAML文件?
答案 0 :(得分:613)
不依赖于C头的最简单和最纯粹的方法是PyYaml(documentation):
#!/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 specification以上的版本。如果需要YAML 1.2 specification支持,请参阅ruamel.yaml中提到的this answer。
答案 1 :(得分:60)
# -*- 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
对于您的应用程序,以下内容可能很重要:
另请参阅:Comparison of data serialization formats
如果您正在寻找制作配置文件的方法,您可能需要阅读我的简短文章Configuration files in Python
答案 2 :(得分:48)
如果您的YAML符合YAML 1.2 specification(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提供:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
答案 3 :(得分:21)
导入yaml模块并将文件加载到名为' my_dict'的字典中:
import yaml
my_dict = yaml.load(open('filename'))
这就是你所需要的一切。现在整个yaml文件都在' my_dict'字典。
答案 4 :(得分:6)
示例:强>
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
答案 5 :(得分:2)
我使用ruamel.yaml。 详情&辩论here 。
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并没有死,因为事实证明,它只是维持在不同的地方。
答案 6 :(得分:1)
要像这样访问YAML文件中列表的任何元素:
global:
registry:
url: dtr-:5000/
repoPath:
dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd
您可以使用以下python脚本:
import yaml
with open("/some/path/to/yaml.file", 'r') as f:
valuesYaml = yaml.load(f, Loader=yaml.FullLoader)
print(valuesYaml['global']['dbConnectionString'])
答案 7 :(得分:0)
#!/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:]))