次のようなyamlファイルがあります。
# The following key opens a door
key: value
コメントを維持しながらこのデータをload
およびdump
できる方法はありますか?
PyYAMLは非常に低いレベルでコメントを破棄します(Scanner.scan_to_next_token
)。
スタック全体でコメントを処理するように変更または拡張することもできますが、これは大きな変更になります。 Dump
ing(=発信)コメントの方が簡単なようで、古いPyYAMLバグトラッカーの チケット114 で議論されました。
ブロック構造の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
は、マッピングの場合に使用され、順序を保持します
私はまさにこれを行うpyyamlのブランチを持っています。 https://github.com/pflarr/pyyaml
コメント付きのyamlファイルを作成するには、コメントイベントを含むイベントストリームを作成する必要があります。コメントは現在、シーケンスアイテムとマッピングキーの前でのみ許可されています。
これは現在python3でのみ機能します。私はそれをpython2バージョンのライブラリに移植していませんが、要求に応じて簡単に移植できます。さらに、pythonコードはとにかく単純な移植なので、これもC libyamlに移植するのはかなり簡単です。