This assumes that the entries are in such an order that a parent node was always introduced as a child of another node beforehand (root excluded).
With that in mind, we can then iterate over the lines, split them (I used split
, regex would work too) and create the new nodes.
For how to get a reference to the parent by name, I came up with two solutions:
First, find the parent by name using 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))
Second, just cache them in a dict while we create them:
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
Output:
A
├── A1
└── A2
└── A21