PythonでYAMLファイルを解析するにはどうすればいいですか?
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 を参照してください。
# -*- 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
アプリケーションにとっては、次のことが重要です。
データ直列化フォーマットの比較 も参照してください。
設定ファイルを作成する方法を探しているのであれば、私の短い記事 Pythonでの設定ファイル を読んでください。
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)
Yamlモジュールをインポートして、ファイルを 'my_dict'という辞書にロードします。
import yaml
my_dict = yaml.load(open('filename'))
必要なものはこれだけです。 yamlファイル全体が 'my_dict'辞書に入っています。
例:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
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は結局死んでいるわけではなく、ただ別の場所に維持されているだけです。
#!/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:]))