簡體   English   中英

如何從 Python 中的 YAML 文件創建樹數據結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM