YAMLファイルの特定のキーの行番号を取得する必要があります。YAMLを解析し、順序付けされたマップでも行番号を取得する
this answerは問題を解決しません。私はruamel.yamlを使用します。答えは順序付きマップでは機能しません。
print(data['key1'].lc.line) # output: 1
print(data['key1']['key4'].lc.line) # output: 4
しかし:
!!omap
キーを除いて、行番号にアクセスすることを許可していません何
CommentedMap([('key1', CommentedOrderedMap([('key2', 'item2'), ('key3', 'item3'), ('key4', CommentedOrderedMap([('key5', 'item5'), ('key6', 'item6')]))]))])
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ruamel import yaml
data = yaml.round_trip_load("""
key1: !!omap
- key2: item2
- key3: item3
- key4: !!omap
- key5: item5
- key6: item6
""")
print(data)
その結果、私はこれを取得
print(data['key1']['key2'].lc.line) # output: AttributeError: 'str' object has no attribute 'lc'
実際、data['key1']['key2]
はstr
です。
私は回避策を見つけた:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from ruamel import yaml
DATA = yaml.round_trip_load("""
key1: !!omap
- key2: item2
- key3: item3
- key4: !!omap
- key5: item5
- key6: item6
""")
def get_line_nb(data):
if isinstance(data, dict):
offset = data.lc.line
for i, key in enumerate(data):
if isinstance(data[key], dict):
get_line_nb(data[key])
else:
print('{}|{} found in line {}\n'
.format(key, data[key], offset + i + 1))
get_line_nb(DATA)
出力:
key2|item2 found in line 2
key3|item3 found in line 3
key5|item5 found in line 5
key6|item6 found in line 6
が、これは少し "汚い" に見えます。それを行うより適切な方法がありますか?
EDIT:この回避策だけでなく、汚れているが、唯一の上記のような単純な場合のために働く、とすぐにネストされたリストは、この問題は、あなたがしていることではない方法
これは本当に複雑に見えますが、おそらく私は回避策に固執するでしょう。ありがとう! – zezollo
私は行番号を得るための答えを更新しました。ダンピング(必要に応じて)をあなたに残すだけでなく、数値、boolおよび他のスカラーを実行します。 – Anthon
優秀!これは私の回避策よりはるかに優れていますが、途中で他の入れ子リストがあるとすぐに正しく機能しませんでした。 – zezollo