59

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

# The following key opens a door
key: value

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

4

3 に答える 3

107

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

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

于 2014-11-24T10:59:26.047 に答える
29

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

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

2020 年の時点で、コメントの読み込みのサポートを追加する機能のリクエストはまだ滞っています。

于 2011-08-31T10:59:43.183 に答える
4

まさにこれを行うpyyamlのブランチがあります。 https://github.com/pflarr/pyyaml

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

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

于 2018-01-10T17:00:52.573 に答える