从文件中读取数据并使用 python 中的任意树创建树
Read data from a file and create a tree using anytree in python
有没有办法从文件中读取数据并使用 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
,正则表达式也可以)并创建新节点。
关于如何通过名称获取对父级的引用,我想出了两个解决方案:
首先,使用任意树按名称查找父节点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))
其次,在我们创建它们时将它们缓存在字典中:
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
有没有办法从文件中读取数据并使用 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
,正则表达式也可以)并创建新节点。
关于如何通过名称获取对父级的引用,我想出了两个解决方案:
首先,使用任意树按名称查找父节点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))
其次,在我们创建它们时将它们缓存在字典中:
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