gpt4 book ai didi

python - 如何从 Python 中的 YAML 文件创建树数据结构?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:57 24 4
gpt4 key购买 nike

假设我有一个 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__ ...

我该怎么做?

最佳答案

有多种适用于 Python 的 YAML 解析器,但唯一的一个支持最新的 YAML 规范(1.2,2009 年发布)是ruamel.yaml (免责声明:我是那个包的作者)。其他包(PySyck、PyYAML)也不支持加载有效的 YAML 结构,例如序列/映射作为映射键。 ruamel.yaml 可以定向到为那些只支持 YAML 1.1 的过时包转储 YAML 1.1YAML 规范的版本。

嵌套的 python dict 可以用作树结构,键为 a节点的值和非 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 也不是真正的树结构。您当然可以遍历您的数据结构并创建一棵节点树,但是这有点落后,因为您可以告诉解析器直接创建一个 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 上行走时,有些事情并不那么容易意识到。

关于python - 如何从 Python 中的 YAML 文件创建树数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53140258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com