Le but du TP est d'afficher dans une image png l'arborescence d'un répertoire
Comme répertoire particulier on va prendre celui du logiciel filius
Voici une partie de l'arborescence des fichiers et sous-répertoires du répertoire filius
Pour réaliser cela on va utiliser un module de Python nommé graphviz dont voici l'API
Dans un premier temps on va découvrir ce module sur un exemple simple
A partir de la classe Noeud vue en cours pour construire les arbres binaires créer "à la main" l'arbre ci-dessus en complétant le code ci-dessous
arbre = Noeud(1,Noeud(2,...),...)
On va ensuite parcourir en largeur l'arbre binaire arbre pour créer un objet Digraph (directed graph pour graphe orienté)ce qui nous permettra de visualiser l'arbre binaire
Pour parcourir en largeur l'arbre on va utiliser une file toute prête de Python provenant du module collections de Python
Lire et comprendre le passage concernant les files (deque pour double ended queue)
Ensuite entrer le code suivant (on parcourt en largeur l'arbre arbre et on crée en même temps l'objet Digraph en créant les noeuds et les arêtes
import graphviz
from collections import deque
import os
def cree_graphviz(arbre):
"""
arbre est non vide
"""
f = deque()
g = graphviz.Digraph(format='png')
f.appendleft(arbre)
while len(f) > 0:
x = f.pop()
g.node(str(x.valeur))
if x.gauche is not None:
g.node(str(x.gauche.valeur))
g.edge(str(x.valeur),str(x.gauche.valeur))
f.appendleft(x.gauche)
if x.droit is not None:
g.node(str(x.droit.valeur))
g.edge(str(x.valeur),str(x.droit.valeur))
f.appendleft(x.droit)
g.view()
Ensuite à l'exécution
arbre = Noeud(1,Noeud(2,...),...)
cree_graphviz(arbre)
Vous devez ensuite obtenir cette image png
Qu'en pensez vous ?
On va utiliser du module os de Python (pour operating system), les méthodes suivantes
os.path.isdir(nom_fichier) qui retourne Vraie si le fichier nommé nom_fichier est un répertoire (directory), et Faux sinon
Attention! img est un sous-répertoire du répertoire filius os.path.isdir('img') retourne Faux, il faut exécuter os.path.isdir(os.path.join('filius','img')) la fonction os.path.join(pere,enfant) relie le nom du repertoire pere au nom du fichier enfant
Se familiariser avec ces deux fonctions avec les fichiers et sous-répertoires du répertoire filius
L'arborescence des fichiers n'est pas un arbre binaire car certains répertoires ont plus de deux successeurs, on va donc utiliser une nouvelle classe Noeud2,dont les attributs sont
class Noeud2:
def __init__(self,v,e):
"""
e est une liste de Noeuds2
"""
self.valeur = v
self.enfants = e
Compléter le code de la fonction récursive suivante pour créer l'arborescence du répertoire nommé filius
Cette fonction retournera un arbre de type Noeud2
def cree_arborescence(pere,f):
if not os.path.isdir(os.path.join(pere,f)):
return ....
else:
liste = os.listdir(os.path.join(pere,f))
enfants = []
for elt in liste:
noeud = ...
enfants.append(noeud)
x = Noeud2(f,enfants)
return x
Pour visualiser l'arborescence obtenue, s'inspirer de la fonction cree_graphviz(arbre) pour créer cree_graphviz2(arbre) car l'arbre n'est pas binaire
Finalement exécuter (ici le répertoire filius est contenu dans le répertoire Documents (adapter à votre situation)) et vous observerez l'arborescence de tous les fichiers et sous-répertoires du répertoire filius
arbre = cree_arborescence('Documents','filius')
cree_graphviz2(arbre)