如何在Python中解析YAML文件

如何在Python中解析YAML文件?


#1楼

不依赖C标头的最简单,最纯净的方法是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,本答案中所述


#2楼

如果您具有符合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)

#3楼

使用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

备择方案

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

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

另请参阅: 数据序列化格式的比较

如果您想寻找一种制作配置文件的方法,则可能需要阅读我的短文《 Python中的配置文件》。


#4楼

#!/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:]))

#5楼

导入yaml模块并将文件加载到名为“ my_dict”的字典中:

import yaml
my_dict = yaml.load(open('filename'))

这就是您所需要的。 现在,整个yaml文件都在“ my_dict”字典中。


#6楼

我使用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并没有死,它只是保存在另一个地方。


#7楼

例:


defaults.yaml

url: https://www.google.com

环境

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
发布了0 篇原创文章 · 获赞 1 · 访问量 3218

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/103955859