从文件中读取数据并使用python中的任意树创建树

从文件中读取数据并使用python中的任意树创建树,python,file,tree,anytree,Python,File,Tree,Anytree,有没有一种方法可以从文件中读取数据并使用anytree构建树 Parent Child A A1 A A2 A2 A21 我可以用静态值来实现它,如下所示。但是,我希望通过使用anytree从文件中读取数据来实现自动化 >>> from anytree import Node, RenderTree >>> A = Node("A") >>> A1 = Node("A1", parent=A) >>&

有没有一种方法可以从文件中读取数据并使用anytree构建树

Parent Child
A      A1
A      A2
A2     A21
我可以用静态值来实现它,如下所示。但是,我希望通过使用anytree从文件中读取数据来实现自动化

>>> from anytree import Node, RenderTree
>>> A = Node("A")
>>> A1 = Node("A1", parent=A)
>>> A2 = Node("A2", parent=A)
>>> A21 = Node("A21", parent=A2)
输出为

A
├── A1
└── A2
    └── A21

这假设条目的顺序是,父节点始终是作为另一个节点的子节点预先引入的(不包括根节点)

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

对于如何通过名称获取对父对象的引用,我提出了两种解决方案:

首先,使用anytrees
find\u by\u 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))

第二步,在我们创建它们时,只需将它们缓存在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))

input.txt

Parent Child
A      A1
A      A2
A2     A21

输出:

A
├── A1
└── A2
    └── A21

您好@Fabian N您介意添加您正在使用的input.txt文件吗?我认为你的回答可以帮助我,但如果没有看到输入,我不确定。你说的“通过名字获取对父对象的引用”是什么意思?Anytree具有导出/导入方法,将精确地为您提供根节点,但是如果您可以提供input.txt,请检查我的问题,非常感谢您猜测您直接将输出作为input.txt使用?一定有更简单的方法@gaurwraith我刚刚将ops示例复制到一个文件中,并将其命名为
input.txt
。你是对的,我首先尝试了anytrees导入器,但是将ops输入转换成anytrees导入器可以理解的东西(基于json、dict或indent)的代码比直接实现要长得多Hi Fabian,你能帮我吗?我现在被困了4个多小时。谢谢