Analyse de fichiers Python: Construire une arborescence à partir d'un fichier texte
J'ai un texte mis en retrait de fichier qui sera utilisé pour construire un arbre. Chaque ligne représente un nœud, et les tirets représentent la profondeur ainsi que le nœud le nœud actuel est un enfant de.
Par exemple, un fichier peut ressembler à
RACINE Node1 Node2 Nœud3 Nœud4 Node5 Node6
Qui indique que la RACINE contient trois enfants: 1, 5, et 6, Node1 a un enfant: 2, et Node2 a un enfant: 3, etc.
Je suis venu avec un algorithme récursif et ont programmé et ça marche, mais c'est moche et surtout traite l'exemple ci-dessus, très grossièrement (lors du passage de nœud 4 nœud 5)
Il utilise "tiret compter" comme la base pour la récursivité, donc si le nombre de tirets = profondeur + 1, je voudrais aller à un niveau plus profond. Mais cela signifie quand j'ai lu une ligne avec moins de tirets, j'ai pour remonter d'un niveau à un moment, la vérification de la profondeur à chaque fois.
Voici ce que j'ai
def _recurse_tree(nœud parent, profondeur): onglets = 0 alors que le nœud: onglets = node.count("\t") si les onglets == profondeur: print "%s: %s" %(parent.strip(), nœud.strip()) elif onglets == profondeur + 1: node = _recurse_tree(nœud, prev, profondeur+1) onglets = node.count("\t") #vérifier si nous avons à la surface de certains plus si les onglets == profondeur: print "%s: %s" %(parent.strip(), nœud.strip()) autre chose: retour nœud autre chose: retour nœud prev = node node = inFile.readline().rstrip() inFile = open("test.txt") racine = inFile.readline().rstrip() node = inFile.readline().rstrip() _recurse_tree(nœud racine, 1)
Droit maintenant, je suis juste l'impression de les nœuds pour vérifier que le nœud parent est correct pour chaque ligne, mais peut-être il ya une façon plus propre de le faire? En particulier dans le cas de l'elif bloc quand je suis de retour de chaque récursion appel.
source d'informationauteur That Umbrella Guy
Vous devez vous connecter pour publier un commentaire.
Le gros problème, c'est le "anticipation" qui, je pense, a causé la laideur en question. Il peut être raccourcie légèrement:
Puisque nous parlons de la récursivité, j'ai pris la peine d'éviter toutes les variables globales (
source
etlast_line
). Il serait plus pythonic pour en faire des membres sur certains analyseur objet.Si vous n'insistez pas sur la récursivité, cela marche aussi:
Résultat:
Je ne voudrais pas utiliser la récursivité pour quelque chose comme ça (Ok, peut-être que je ferais si j'étais ce codage dans un langage comme Système, mais c'est Python ici). La récursivité est idéal pour parcourir de données qui a la forme d'un arbre, et dans ces cas, il permettrait de simplifier votre conception de considérablement lorsqu'par rapport à la normale des boucles.
Cependant, ce n'est pas le cas ici. Vos données sûrement représente un arbremais il est formaté de manière séquentielle, c'est à dire c'est une simple séquence de lignes. Ces données sont plus facilement traitée avec une simple boucle, bien que vous pourriez rendre la conception plus générale, si vous le souhaitez, en la séparant en trois couches différentes: la séquence du lecteur (qui va analyser les onglets comme une spécification de niveau de profondeur), l'arbre insertion (qui insère un nœud dans un arbre dans un niveau de profondeur, en gardant la trace du dernier nœud qui a été inséré dans l'arbre) et l'arbre lui-même:
Lorsque j'ai eu à tester ce code avant de le coller ici, j'ai écrit une fonction très simple et joli imprimer l'arbre que j'ai lu de la mémoire. Pour cette fonction, la chose la plus naturelle est d'utiliser la récursivité, bien sûr, parce que maintenant, l'arbre est en effet représenté comme un arbre de données: