1

YAML ファイルの特定のキーの行番号を取得する必要があります。

この回答は問題を解決しないことに注意してください。私はruamel.yamlを使用していますが、回答は順序付けられたマップでは機能しません。

#!/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)

その結果、私はこれを得る:

CommentedMap([('key1', CommentedOrderedMap([('key2', 'item2'), ('key3', 'item3'), ('key4', CommentedOrderedMap([('key5', 'item5'), ('key6', 'item6')]))]))])

!!omapキーを除いて、行番号へのアクセスを許可しないもの:

print(data['key1'].lc.line)  # output: 1
print(data['key1']['key4'].lc.line)  # output: 4

しかし:

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

しかし、これは少し「汚い」ように見えます。それを行うためのより適切な方法はありますか?

編集:この回避策は汚いだけでなく、上記のような単純なケースでのみ機能し、途中でネストされたリストがあるとすぐに間違った結果をもたらします

4

2 に答える 2