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

3991 ワード

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せんたく案
  • CSV:超単純フォーマット(読み書き)
  • JSON:人間が読めるデータを書くのに非常に適しています.よく使われる(読み書き)
  • YAML:YAMLはJSONのスーパーセットですが、読みやすい(読み書き、JSONとYAMLの比較)
  • pickle:Pythonシーケンス化フォーマット(読み書き)
  • MessagePack(Pythonパッケージ):よりコンパクトな表示形式(読み取りと書き込み)
  • HDF 5(Pythonパッケージ):マトリクス(読み書き)
  • に適用
  • XML:存在が多すぎる*嘆*(読み取りと書き込み)
  • アプリケーションでは、次のことが重要です.
  • その他のプログラミング言語のサポート
  • 読書/作文表現
  • コンパクト度(ファイルサイズ)
  • 関連項目:データ・シーケンス化フォーマットの比較
    プロファイルを作成する方法を探している場合は、私の短文「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']