我需要獲取YAML文件中某些鍵的行號。解析YAML,即使在有序圖中也能得到行號
請注意,this answer不能解決問題:我確實使用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
但是這看起來有點 「髒」。有沒有更正確的方法呢?
編輯:此變通辦法不僅髒,但只適用於簡單的情況下,像上面的一個,並且將盡快有嵌套列表的方式給出錯誤的結果
好的,所以,它看起來非常複雜,也許我會堅持我的解決方法。謝謝! – zezollo
我更新了獲取行號的答案,我將把傾銷(如有必要)留給你,以及做數字,布爾和其他標量。 – Anthon
優秀!這比我的解決方法好得多,只要有其他嵌套列表的方式,就不能正常工作。 – zezollo