web-dev-qa-db-ja.com

PyYAMLでコメント付きのYAMLファイルを保存/ダンプする

次のようなyamlファイルがあります。

# The following key opens a door
key: value

コメントを維持しながらこのデータをloadおよびdumpできる方法はありますか?

50
Harley Holcombe

PyYAMLは非常に低いレベルでコメントを破棄します(Scanner.scan_to_next_token)。

スタック全体でコメントを処理するように変更または拡張することもできますが、これは大きな変更になります。 Dumping(=発信)コメントの方が簡単なようで、古いPyYAMLバグトラッカーの チケット114 で議論されました。

14
phihag

ブロック構造のYAMLを使用している場合、pythonパッケージ¹ ruamel.yaml を使用できます。これはPyYAMLの派生物であり、サポートコメントの往復保存

import sys
import ruamel.yaml

yaml_str = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

yaml = ruamel.yaml.YAML()  # defaults to round-trip if no parameters given
code = yaml.load(yaml_str)
code['name']['given'] = 'Bob'

yaml.dump(code, sys.stdout)

結果:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

行末のコメントはまだ揃えられていることに注意してください。

通常のlistおよびdictオブジェクトの代わりに、codeはコメントが添付されたラップバージョン²で構成されます。

¹ pip install ruamel.yamlでインストールします。 Python 2.6/2.7/3.3 +で動作します
² ordereddictは、マッピングの場合に使用され、順序を保持します

73
Anthon

私はまさにこれを行うpyyamlのブランチを持っています。 https://github.com/pflarr/pyyaml

コメント付きのyamlファイルを作成するには、コメントイベントを含むイベントストリームを作成する必要があります。コメントは現在、シーケンスアイテムとマッピングキーの前でのみ許可されています。

これは現在python3でのみ機能します。私はそれをpython2バージョンのライブラリに移植していませんが、要求に応じて簡単に移植できます。さらに、pythonコードはとにかく単純な移植なので、これもC libyamlに移植するのはかなり簡単です。

1
Paul Ferrell