[英]How can I create a tree data structure from a YAML file in Python?
假設我有一個 YAML 文件,如下所示:
template:
artifacts:
config:
a: value1
b: value2
jars:
a: value1
b: value2
scripts:
a: value1
b: value2
我想讓它像一棵樹一樣,如下所示:
template--
|__artifacts__
|__config__
| |__a__
| | |__value1
| |
| |__b__
| |__value2
|__jars__ ...
我怎樣才能做到這一點?
有多種 YAML 解析器可用於 Python,但唯一支持最新 YAML 規范( 1.2,2009年發布)的解析器是ruamel.yaml (免責聲明:我是該包的作者)。 其他包(PySyck、PyYAML)也不支持加載有效的 YAML 結構,例如序列/映射作為映射鍵。 ruamel.yaml
可以針對那些僅支持該版本 YAML 規范的過時包轉儲 YAML 1.1。
嵌套的 python dict
可以用作樹結構,鍵是節點的值,值是非dict
的葉節點。 這是從 YAML 文件中的映射加載的數據結構。
from pathlib import Path
from pprint import pprint
import ruamel.yaml
input = Path('input.yaml')
yaml = ruamel.yaml.YAML()
data = yaml.load(input)
pprint(data)
這使:
{'template': {'artifacts': {'config': {'a': 'value1',
'b': 'value2'},
'jars': {'a': 'value1',
'b': 'value2'},
'scripts': {'a': 'value1',
'b': 'value2'}}}}
這看起來不像您預期的輸出,dicts 也不是真正的樹結構。 您當然可以遍歷您的data
結構並創建一個Node
樹,但這有點落后,因為您可以在構建樹時告訴解析器直接創建一個Node
。
import sys
from ruamel.yaml.constructor import SafeConstructor
class Node:
# your node definition here
pass
class MyConstructor(SafeConstructor):
def construct_yaml_map(self, node):
data = Node()
yield data
res = self.construct_mapping(node)
# and update data with the parsed data
MyConstructor.add_constructor('tag:yaml.org,2002:map',
MyConstructor.construct_yaml_map)
yaml = ruamel.yaml.YAML()
yaml.Constructor = MyConstructor
data = yaml.load(input)
請注意,以上內容會自動處理 YAML 文件中的遞歸結構,當遍歷以正常方式加載的 YAML 時,這並不容易實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.