Système de fichiers
On s'intéresse dans cet exercice au système de fichiers sur un ordinateur. On considère dans ce cadre les deux éléments suivants :
-
des fichiers, représentés en machine par des tuples au format
(nom_du fichier, None)
.nom_du_fichier
est une chaîne de caractères ; -
des dossiers, représentés en machine par des tuples au format
(nom_du_dossier, liste_des_enfants)
.nom_du_dossier
est une chaîne de caractères,liste_des_enfants
est une liste contenant de nouveaux éléments (fichiers ou dossiers).
L'exemple ci-dessous est constitué d'un dossier nommé racine
contenant un fichier (un.py
) et un sous-dossier (nommé sous_dossier
) contenant lui-même deux fichiers (deux.pdf
et trois.jpg
) :
racine
├───un.py
└───sous_dossier
├───deux.pdf
└───trois_jpg
Ce dossier est représenté en machine par le tuple :
("racine", [("un.py", None), ("sous_dossier", [("deux.pdf", None), ("trois.jpg", None)])])
On fournit deux fonctions, est_fichier
et est_dossier
, indiquant, pour un élément quelconque, s'il s'agit d'un fichier ou d'un dossier :
>>> elt = ("un.py", None)
>>> est_fichier(elt)
True
>>> est_dossier(elt)
False
>>> elt = ("dossier_vide", [])
>>> est_fichier(elt)
False
>>> est_dossier(elt)
True
Code des deux fonctions
def est_fichier(elt):
return elt[1] is None
def est_dossier(elt):
return type(elt[1]) is list
On cherche dans cet exercice, étant donné un dossier, à calculer le nombre de dossiers et de fichiers qu'il contient ainsi que sa profondeur et le contenu d'un de ses sous-dossiers descendant.
1. Nombre de dossiers
Écrire la fonction nb_dossiers
qui prend en paramètre un tuple représentant un dossier et renvoie le nombre de dossiers que celui-ci contient au total : lui-même et ses sous-dossiers ainsi que les sous-dossiers de ceux-ci...
Exemples
>>> dossier_nsi = ("nsi", [("tp1.py", None), ("tp1.pdf", None)])
>>> nb_dossiers(dossier_nsi)
1
>>> dossier_doc = ("documents", [("photo.jpg", None), dossier_nsi])
>>> nb_dossiers(dossier_doc)
2
2. Nombre de fichiers
Écrire la fonction nb_fichiers
qui prend en paramètre un tuple représentant un dossier et renvoie le nombre de fichiers que celui-ci contient au total : ses fichiers mais aussi ceux présents dans ses sous-dossiers et les sous-dossiers de ceux-ci...
Exemples
>>> dossier_nsi = ("nsi", [("tp1.py", None), ("tp1.pdf", None)])
>>> nb_fichiers(dossier_nsi)
2
>>> dossier_doc = ("documents", [("photo.jpg", None), dossier_nsi])
>>> nb_fichiers(dossier_doc)
3
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
3. Profondeur
On définit la profondeur d'un dossier comme la longueur maximale d'un chemin menant de ce dossier à un dossier ne contenant pas de sous-dossiers.
La profondeur d'un dossier vide ou ne contenant que des fichiers est donc égale à 0
.
Écrire la fonction profondeur
qui prend en paramètre un tuple représentant un dossier et renvoie la profondeur de celui-ci.
Exemples
>>> dossier_nsi = ("nsi", [("tp1.py", None), ("tp1.pdf", None)])
>>> profondeur(dossier_nsi)
0
>>> dossier_doc = ("documents", [("photo.jpg", None), dossier_nsi])
>>> profondeur(dossier_doc)
1
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
4. Contenu
On appelle contenu d'un dossier l'ensemble des sous-dossiers et des fichiers qu'il contient.
De même on appelle chemin entre deux dossiers, le nom des sous-dossiers traversés afin d'accéder du premier au dernier. Le nom du dossier de départ ne fait pas partie du chemin, par contre celui du dossier d'arrivée en fait partie.
Écrire la fonction contenu
qui prend en paramètre un tuple représentant un dossier et un chemin menant de ce dossier à un de ses descendants. Cette fonction le contenu du sous-dossier visé par le chemin.
On garantit que le chemin passé en paramètre mène à un sous-dossier existant.
Exemples
>>> dossier_nsi = ("nsi", [("tp1.py", None), ("tp1.pdf", None)])
>>> contenu(dossier_nsi, [])
[("tp1.py", None), ("tp1.pdf", None)]
>>> dossier_doc = ("documents", [("photo.jpg", None), dossier_nsi])
>>> contenu(dossier_doc, ["nsi"])
[("tp1.py", None), ("tp1.pdf", None)]
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)