如何在Python中解析YAML文件

Szy*_*ski 547 python yaml

如何在Python中解析YAML文件?

Jon*_*Jon 726

PyYaml是一种不依赖C头的最简单,最纯粹的方法:

#!/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)
Run Code Online (Sandbox Code Playgroud)

就是这样.更多信息:

http://pyyaml.org/wiki/PyYAMLDocumentation

  • 我想补充说,除非你想序列化/反序列化任意对象,否则最好使用``yaml.safe_load``,因为它不能从YAML文件中执行任意代码. (84认同)
  • 在此示例中捕获异常有什么意义?无论如何它都会打印出来,这只会使示例更复杂。 (6认同)
  • Yaml yaml = new Yaml(); Object obj = yaml.load("a:1 \nb:2 \nc:\n - aaa \n - bbb"); (3认同)
  • 您可能需要先安装PyYAML软件包`pip install pyyaml`,有关更多选项,请参见此帖子/sf/ask/998313011/ (3认同)
  • 我喜欢moose的文章:http://martin-thoma.com/configuration-files-in-python/ (2认同)
  • 我觉得这真的应该是 1 班轮。为什么没有一个 `yaml.read()` api 或类似的方法返回一个字典? (2认同)

Mar*_*oma 92

使用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)
Run Code Online (Sandbox Code Playgroud)

创建了YAML文件

a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42
Run Code Online (Sandbox Code Playgroud)

常见文件结尾

.yml.yaml

备择方案

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

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

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

如果您正在寻找一种制作配置文件的方法,您可能希望阅读我的简短文章Python中的配置文件

  • 您使用“import yaml”,但这不是内置模块,并且您没有指定它是哪个包。在新安装的 Python3 上运行“import yaml”会导致“ModuleNotFoundError:没有名为“yaml”的模块” (8认同)
  • `pip install pyyaml` 使 `import yaml` 正常工作 (3认同)

Ant*_*hon 56

如果您的YAML符合YAML 1.2规范(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)
Run Code Online (Sandbox Code Playgroud)

使用safe_load()除非你真的完全控制输入,需要它(很少这种情况)并知道你在做什么.

如果您使用pathlib Path来操作文件,则最好使用新的API ruamel.yaml提供:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
Run Code Online (Sandbox Code Playgroud)


小智 23

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

import yaml
my_dict = yaml.load(open('filename'))
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的.现在整个yaml文件都在'my_dict'字典中.

  • 这会关闭文件句柄吗? (6认同)
  • 您使用“import yaml”,但这不是内置模块,并且您没有指定它是哪个包。在新安装的 Python3 上运行“import yaml”会导致“ModuleNotFoundError:没有名为“yaml”的模块” (5认同)
  • 如果您的文件包含“-hello world”行,则不宜调用变量my_dict,因为它将包含一个列表。如果该文件包含特定标签(以!! python开头),则使用`yaml.load()`也可能是不安全的(如完全擦除硬盘一样)。如已明确记录的那样,您应该在此处重复该警告(几乎在所有情况下都可以使用“ yaml.safe_load()”)。 (2认同)

Pra*_*ams 10

例:

defaults.yaml

url: https://www.google.com
Run Code Online (Sandbox Code Playgroud)

environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
Run Code Online (Sandbox Code Playgroud)


小智 5

要访问 YAML 文件中列表的任何元素,如下所示:

global:
  registry:
    url: dtr-:5000/
    repoPath:
  dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd
Run Code Online (Sandbox Code Playgroud)

您可以使用以下 python 脚本:

import yaml

with open("/some/path/to/yaml.file", 'r') as f:
    valuesYaml = yaml.load(f, Loader=yaml.FullLoader)

print(valuesYaml['global']['dbConnectionString'])
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

501993 次

最近记录:

6 年 前