我正在使用anytree从文件Tree.txt
生成一棵树。每个缩进是3个空格()。以下是我的文件的外观:
ROOT
Node1
Node2
Node3
Node4
Node5
Node6
以下是我到目前为止对生成代码的了解:
from anytree import Node, RenderTree, find_by_attr
def parse_tree():
with open('Tree.txt', 'r') as file:
file_contents = file.readlines()
root = Node("ROOT")
current_indent = -1 # store index for comparing later
for (index, line) in enumerate(file_contents):
leading_spaces = len(line) - len(line.lstrip(' '))
indent = int(leading_spaces / 3) # indent = 3 spaces
if indent > current_indent: # node must be 1 level down
# get the previous Node (1 level up)
previous_line = file_contents[index - 1].strip()
current_line = line.strip()
parent = find_by_attr(root, previous_line)
Node(current_line, parent=parent) # start searching from top node (root) for `previous_line`
current_indent = indent
else: # node is on same level or higher
print(f"What to do for {line.strip()}?")
# what should I do here?
print(RenderTree(root)) # print the output
parse_tree()
但是,这会打印出:
What to do for Node5?
What to do for Node6?
Node('/ROOT')
└── Node('/ROOT/Node1')
└── Node('/ROOT/Node1/Node2')
└── Node('/ROOT/Node1/Node2/Node3')
└── Node('/ROOT/Node1/Node2/Node3/Node4')
生成的树很好,但直到缺少Node4
-Node5
和Node6
为止。这是意料之中的,因为我没有处理当前缩进小于前一缩进的情况(请参见^{
当当前缩进小于上一缩进时,我应该怎么做?我知道我需要提高n
级别,但我如何确定这是哪个级别
需要一种堆栈来跟踪节点的深度,然后可以使用初始空间的数量来确定将每个叶附加到哪个父节点。例如,三个空格意味着向下一级,因此需要附加到堆栈中索引0处的根节点。(你也可以说,通过使用一个堆栈,我们得到了树叶的绝对深度,而你试图解决它相对,如果我说得通的话)。我怀疑如果您使用
find_by_attr
,在有同名叶子的情况下,这可能不起作用结果:
相关问题 更多 >
编程相关推荐