如何在Python中解析YAML文件

时间:2009-11-20 23:16:16

标签: python yaml

如何在Python中解析YAML文件?

8 个答案:

答案 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)

阅读&使用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

替代

对于您的应用程序,以下内容可能很重要:

  • 其他编程语言的支持
  • 阅读/写作表现
  • 紧凑性(文件大小)

另请参阅: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:]))