从文件中读取数据并在 python 中使用 anytree 创建一棵树

hsh*_*anu 5 python tree file anytree

有没有办法从文件中读取数据并使用 anytree 构造树?

Parent Child
A      A1
A      A2
A2     A21
Run Code Online (Sandbox Code Playgroud)

我可以使用静态值来做到这一点,如下所示。但是,我想通过使用 anytree 从文件中读取数据来自动执行此操作。

>>> from anytree import Node, RenderTree
>>> A = Node("A")
>>> A1 = Node("A1", parent=A)
>>> A2 = Node("A2", parent=A)
>>> A21 = Node("A21", parent=A2)
Run Code Online (Sandbox Code Playgroud)

输出是

A
??? A1
??? A2
    ??? A21
Run Code Online (Sandbox Code Playgroud)

Fab*_* N. 6

这假设条目的顺序是父节点总是事先作为另一个节点的子节点被引入(根除外)。

考虑到这一点,然后我们可以遍历这些行,拆分它们(我使用split,regex 也可以)并创建新节点。

对于如何按名称获取对父级的引用,我想出了两个解决方案:

首先,使用anytrees按名称查找父项find_by_attr

from anytree import Node, RenderTree, find_by_attr

with open('input.txt', 'r') as f:
    lines = f.readlines()[1:]
    root = Node(lines[0].split(" ")[0])

    for line in lines:
        line = line.split(" ")
        Node("".join(line[1:]).strip(), parent=find_by_attr(root, line[0]))

    for pre, _, node in RenderTree(root):
        print("%s%s" % (pre, node.name))
Run Code Online (Sandbox Code Playgroud)

其次,只需在我们创建它们时将它们缓存在 dict 中:

from anytree import Node, RenderTree, find_by_attr

with open('input.txt', 'r') as f:
    lines = f.readlines()[1:]
    root = Node(lines[0].split(" ")[0])
    nodes = {}
    nodes[root.name] = root

    for line in lines:
        line = line.split(" ")
        name = "".join(line[1:]).strip()
        nodes[name] = Node(name, parent=nodes[line[0]])

    for pre, _, node in RenderTree(root):
        print("%s%s" % (pre, node.name))
Run Code Online (Sandbox Code Playgroud)

输入文件

Parent Child
A      A1
A      A2
A2     A21
Run Code Online (Sandbox Code Playgroud)

输出:

A
??? A1
??? A2
    ??? A21
Run Code Online (Sandbox Code Playgroud)