web-dev-qa-db-ja.com

PythonでYAMLファイルを解析する方法

PythonでYAMLファイルを解析するにはどうすればいいですか?

445

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仕様 までのバージョンをサポートしています。 YAML 1.2仕様 supportが必要な場合は、 this answer に記載されているように ruamel.yaml を参照してください。

607
Jon

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での設定ファイル を読んでください。

54
Martin Thoma

YAML 1.2仕様 (2009年リリース)に準拠するYAMLがある場合は、 ruamel.yaml を使用してください(免責事項:私はそのパッケージの作者です)。これは基本的にPyYAMLのスーパーセットであり、(2005年以降)ほとんどのYAML 1.1をサポートしています。

ラウンドトリップ時にコメントを保存したい場合は、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)
47
Anthon

Yamlモジュールをインポートして、ファイルを 'my_dict'という辞書にロードします。

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

必要なものはこれだけです。 yamlファイル全体が 'my_dict'辞書に入っています。

19
Pal

例:

defaults.yaml

url: https://www.google.com

environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
6
Prashanth Sams

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

そしてそれはあなたの問題の大部分を修正するでしょう。

_ edit _ :PyYAMLは結局死んでいるわけではなく、ただ別の場所に維持されているだけです。

2
#!/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 __== "__main__":
    sys.exit(main(sys.argv[1:]))
0