2016-07-07 3 views
3

ruamel.yamlを使用してロードしたYAMLファイルからコメント文字列を取得したいとします。 project documentationにはAPIリファレンスがなく、関連するサンプルが見つかりません。コメントにアクセスする正しい方法は何ですか?Pythonでruamel.yamlを使用してYAMLファイルからコメントを取得するにはどうすればよいですか?

import ruamel.yaml 

yaml = """\ 
%YAML 1.2 
--- 
# C1 
a: # C2 
    # C3 
    # C4 
    b: 1 # C5 
    c: # A comment here will not be parsed properly by ruamel.yaml v0.11.14 
    - abC# C6 
    - xyz # C7 
    # C8 
# C9 
""" 

loaded = ruamel.yaml.round_trip_load(yaml) 

# Now what? 
+1

唯一のキーを持つ行にコメントを持っているし、適切に維持するために、まだ実際に可能ではありませんそれ。これは、APIがない理由の1つであり、 'ruamel.yaml'はより完全でなければなりません(潜在的なデータ構造が変更されるべきこれらの稀なケースをサポートすることを含む)。コメントストレージには、リストインデックスの代わりに(スクランブルされた順序で)意味のある属性名が必要です。 'ruamel.yaml'はPyYAMLの遺産をもっとなくすべきですし、Cのパーサーステージを使うときにはコメントラウンドトリップも働かなければなりません。 – Anthon

+1

そして、それ自身の行のコメントが前のスカラーに属するのか、それとも次のスカラーに属するのかを決めるのはもちろん問題です。 – Anthon

答えて

1

an issue on BitBucketで、この上のライブラリの作者のコメント(2016年5月9日):

コメント保全は、例えば、安定していませんマッピングのキーと値が同じ行になく、キー(またはキーと値の両方)にコメントがある場合は、何かをする必要があります。そして私の最初の目標は、あまり多くの操作ではなく、既存のコメントの保存でした。私は上記の質問で提供されるサンプルコードについて、次の作品を決定し、いくつかの実験を通して

print('Comment 1: ' + loaded.ca.comment[1][0].value) 
print('Comment 2: ' + loaded.ca.items['a'][2].value) 
print('Comment 3: ' + loaded.ca.items['a'][3][0].value) 
print('Comment 4: ' + loaded.ca.items['a'][3][1].value) 
print('Comment 5: ' + loaded['a'].ca.items['b'][2].value) 
print('Comment 6: ' + loaded['a']['c'].ca.items[0][0].value) 
print('Comment 7: ' + loaded['a']['c'].ca.items[1][0].value) 
print('Comment 8: ' + loaded['a']['c'].ca.end[0].value) 
print('Comment 9: ' + loaded['a']['c'].ca.end[1].value) 
+0

はい、一般的にマッピング/ dictオブジェクトを持っているなら 'ca .items [key]キーに関連するコメントを取得し、同様にシーケンス/リストでは、特定の要素に対して 'ca.items [index]'を使用します。 '_test/test_comment_manipulation.py'の操作は、新しいコメントを設定する方法の手がかりをさらに与えることができます。 – Anthon

関連する問題