import os
'''
----------------------------------------------------------------------------------------------------
Classe Node - Permet la construction progressive d'un arbre par ajouts successifs de sous-noeuds
- Chaque instance représente un noeud dans une arborescence, qui peut être:
-- le noeud racine d'un arbre (donc l'arbre entier)
-- un noeud à l'intérieur de l'arbre, lui-même sous-noeud d'un noeud parent
-- une feuille qui n'a pas de noeud enfant
- La valeur du noeud peut être de n'importe quel type ex: chaine, entier etc... notamment un
objet lui-même (qui serait manipulable par une lambda)
----------------------------------------------------------------------------------------------------
'''
class Node:
# Instanciation d'un noeud uniquement avec sa valeur (pas de sous-noeud au départ)
def __init__(self,nodeValue):
self.subNodes = []
self.value = nodeValue
# Ajoute un sous-noeud à l'instance (enfant direct)
def addSubNode(self,node):
self.subNodes.append(node)
# Affiche l'instance (valeur du noeud) et tous ses sous-noeuds (s'il en est) par récursivité
# en organisant l'affichage de manière à décaler chaque sous-niveau de deux espaces
def view(self,depth = 0):
# Si le noeud contient des sous-noeuds, on affiche son nom entre crochets
if self.subNodes:
print("{}[{}]".format(" " * depth, self.value))
else:
print(" " * depth, self.value)
# On augmente la profondeur et on passe aux enfants éventuels par récursivité
depth += 1
for node in self.subNodes: node.view(depth)
'''
----------------------------------------------------------------------------------------------------
Exemple d'utilisation de la classe Node ci-dessus pour lister les fichiers et sous-répertoires
d'un repertoire racine
NB: on peut tester avec l'exemple d'arborescence jointe : "test_directory" à mettre à la racine du disque dur
----------------------------------------------------------------------------------------------------
'''
# Construit un arbre représentatif de l'architecture des fichiers et réperoires, à partir du chemin
# fourni, en utilisant la classe Node de manière récursive.
# Nécessite l'import du package "os" pour la lecture des noms de fichiers/répertoire sur le disque
def getDirectoryNode(path):
# On construit le noeud racine (donc l'arbre) en ne conservant que le nom de fichier et pas le
# chemin complet pour faciliter la lecture in fine
node = Node(os.path.split(path)[1])
# si le chemin désigne un répertoire, on ajoute un sous-noeud pour chaque fichier/répertoire
# qu'il contient
if os.path.isdir(path):
for itemName in os.listdir(path):
fullPathName = os.path.join(path,itemName) # Reconstruction du chemin complet
node.addSubNode(getDirectoryNode(fullPathName)) # Injection du sous-noeud correspondant
return node
'''
----------------------------------------------------------------------------------------------------
Test in situe (nécessite l'existence du répertoire de test test_directory) - afiner le chemin
si besoin
----------------------------------------------------------------------------------------------------
'''
tree = getDirectoryNode("C:\\test_directory")
tree.view()