Разбор файла Python: Построить дерево из текстового файла

У меня есть текстовый файл с отступом, который будет использоваться для построения дерева. Каждая строка представляет узел, а отступы представляют глубину, а также узел, дочерним элементом которого является текущий узел.

Например, файл может выглядеть как

ROOT
   Node1
      Node2
         Node3
            Node4
   Node5
   Node6

, что указывает на то, что ROOT содержит трех дочерних элементов: 1, 5 и 6 , У узла 1 есть один дочерний элемент: 2, а у узла 2 - один дочерний элемент: 3 и т. Д.

Я придумал рекурсивный алгоритм, запрограммировал его, и он работает, но он уродлив и особенно грубо относится к приведенному выше примеру. (при переходе от узла 4 к узлу 5)

Он использует «количество отступов» в качестве основы для рекурсии, поэтому, если количество отступов = текущая глубина + 1, я бы пошел на один уровень глубже. Но это означает, что когда я читаю строку с меньшим количеством отступов, Я должен возвращаться на один уровень за раз, проверяя глубину каждый раз.

Вот что у меня есть

def _recurse_tree(node, parent, depth):
    tabs = 0

    while node:
        tabs = node.count("\t")
        if tabs == depth:
            print "%s: %s" %(parent.strip(), node.strip())
        elif tabs == depth + 1:
            node = _recurse_tree(node, prev, depth+1)
            tabs = node.count("\t")

            #check if we have to surface some more
            if tabs == depth:
                print "%s: %s" %(parent.strip(), node.strip())
            else:
                return node
        else:
            return node

        prev = node
        node = inFile.readline().rstrip()

inFile = open("test.txt")
root = inFile.readline().rstrip()
node = inFile.readline().rstrip()
_recurse_tree(node, root, 1)

Прямо сейчас я просто распечатываю узлы, чтобы убедиться, что родительский узел правильный для каждой строки, но, может быть, есть более чистый способ сделать это? Особенно в случае блока elif, когда я возвращаюсь после каждого вызова рекурсии.

15
задан Santa 20 May 2011 в 19:06
поделиться