Differences between revisions 4 and 11 (spanning 7 versions)
Revision 4 as of 2013-05-21 14:49:37
Size: 782
Editor: iml138
Comment:
Revision 11 as of 2013-05-22 12:33:28
Size: 4866
Editor: 194
Comment:
Deletions are marked like this. Additions are marked like this.
Line 7: Line 7:
== ==
Line 11: Line 9:
=== Spécification du problème === On va écrire un programme :
 * qui prend en entrée un `dossier` et un `nom` de fichier,
 * qui recherche si un fichier `nom` apparait dans le `dossier` ou dans ses sous-dossiers,
 * qui affiche le chemin complet vers ce fichier.
Line 13: Line 14:
=== Quelques indications === === Préliminaires ===
Line 15: Line 16:
Pour obtenir la liste des éléments d’un dossier, on utilise la fonction
`os.listdir` :
{{{#!highlight python
import os
os.listdir()
}}}
affichera le contenu du dossier courant (sous Windows, c’est probablement celui
où se trouve l’interpréteur python).
Line 16: Line 25:
Testez.

{{{#!wiki tip
Il est possible de changer le dossier courant avec la fonction
`os.chdir`.

Pour construire un chemin, on peut utiliser la fonction `os.path.join` qui s'occupe
d'ajouter les séparateurs de dossier (`\` sous Windows, `/` dans le reste du monde).

}}}

Par exemple, sous Windows:
{{{#!highlight python
os.chdir(os.path.join('/','Documents and Settings','Utilisateur','Mes documents','ISN','1B5'))
}}}
vous amènera dans `\Documents and Settings\Utilisateur\Mes documents\ISN\1B5`.

Pour savoir si un chemin mène vers un dossier ou un fichier, on utilise
la fonction `os.path.isdir`.
{{{#!highlight python
>>> os.path.isdir(os.path.join('/','Documents and Settings'))
True
>>> os.path.isdir(os.path.join('/','Python32','README.txt'))
False
}}}
Testez.

=== Au travail ===

Mettez d’abord au point un algorithme de parcours
dans le système de fichier : de quelle structure s’agit-il (un arbre, oui, mais
de quel genre) ? quel parcours faire ?

Écrivez alors une fonction :
{{{#!highlight python
def cherche_fichier(dossier,nom):
 ...
}}}
qui renvoie la liste des chemins des fichiers `nom` accessibles à partir de
`dossier`.
Line 19: Line 68:
 * Permettre de rechercher un sous-mot.
 * Recherche multicritère: nom, taille, date, ...
Si vous êtes à l’aise, vous pouvez considérer les extensions suivantes.
Si vous avez déjà passé beaucoup de temps sur ce qui précède, mieux vaut passer
à la tâche 2.

==== Permettre de rechercher un sous-mot ====

Si on cherche tous les fichiers python, la fonction précédente ne sert pas à
grand chose. On voudrait utiliser des motifs du genre `*.py`.
Ça tombe bien, il y a aussi une bibliothèque python pour ça : `fnmatch`.

{{{#!highlight python
>>> import fnmatch
>>> fnmatch.fnmatch('toto.py', '*.py')
True
>>> fnmatch.fnmatch('totopy', '*.py')
False
}}}

Étendez la fonction de recherche en :
{{{#!highlight python
def cherche_motif(dossier,motif):
 ...
}}}


==== Recherche multicritère: nom, taille, date, ... ====

On peut connaître la taille d’un fichier avec la fonction
`os.path.getsize`. La date de dernière modification
est obtenue avec `os.getmtime`.

Genéralisez la fonction de recherche en :
{{{#!highlight python
def cherche_test(dossier,test):
 ...
}}}
où `test` spécifie des critères à vérifier
pour qu’un fichier soit retenu. On discutera
ensemble des solutions possibles pour
donner ces critères (c’est la seule vraie difficulté ici).
Line 24: Line 111:
=== Spécification du problème === On cherche maintenant à estimer l’espace disque occupé par le contenu d’un
dossier (et de ses sous-dossiers).
Line 26: Line 114:
=== Quelques indications === Rappelons (?) que la taille d’un fichier est donnée par la fonction
`os.path.getsize` :
{{{#!highlight python
import os
for fichier in os.listdir():
 print('{nom:20s}\t{taille:10d}'.format(
  nom=fichier,
  taille=os.path.getsize(fichier),
 ))
}}}
affichera la liste des fichiers du dossier courant ainsi que leur taille (en octets).

=== Au travail ===

Écrivez une fonction :
{{{#!highlight python
def utilisation_disque(dossier):
    ...
}}}
qui renvoie la quantité d’espace disque (en octets) occupée par le contenu du
`dossier`.

=== Extensions possibles ===

Écrivez une fonction :
{{{#!highlight python
def affiche_utilisation_disque(dossier,profondeur):
    ...
}}}
qui affiche récursivement la taille occupée par les sous-dossiers, jusqu’à
une `profondeur` fixée.
L’affichage devrait reproduire l’arborescence.

Ajoutez des arguments optionnels pour :
 * trier les résultats par taille, ou par nom ;
 * spécifier une unité autre que l’octet ;
 * afficher des barres proportionnelles à la taille occupée par les sous-dossiers ;
 * générer (avec PIL) une représentation graphique de l’utilisation du disque dur
 (barres ou camembert).
Line 30: Line 156:
Créez une interface graphique pour les programmes précédents. Créez une interface graphique pour l’un des programmes précédents.

C’est la séance 1B5 de la formation 2012-2013.

Ce TP met en œuvre la notion de parcours dans un arbre. L’arbre en question est celui du système de fichiers : c’est donc l’occasion d’introduire un peu de programmation système en Python 3.

Tâche 1 : recherche de fichier

On va écrire un programme :

  • qui prend en entrée un dossier et un nom de fichier,

  • qui recherche si un fichier nom apparait dans le dossier ou dans ses sous-dossiers,

  • qui affiche le chemin complet vers ce fichier.

Préliminaires

Pour obtenir la liste des éléments d’un dossier, on utilise la fonction os.listdir :

   1 import os
   2 os.listdir()

affichera le contenu du dossier courant (sous Windows, c’est probablement celui où se trouve l’interpréteur python).

Testez.

Il est possible de changer le dossier courant avec la fonction os.chdir.

Pour construire un chemin, on peut utiliser la fonction os.path.join qui s'occupe d'ajouter les séparateurs de dossier (\ sous Windows, / dans le reste du monde).

Par exemple, sous Windows:

   1 os.chdir(os.path.join('/','Documents and Settings','Utilisateur','Mes documents','ISN','1B5'))

vous amènera dans \Documents and Settings\Utilisateur\Mes documents\ISN\1B5.

Pour savoir si un chemin mène vers un dossier ou un fichier, on utilise la fonction os.path.isdir.

   1 >>> os.path.isdir(os.path.join('/','Documents and Settings'))
   2 True
   3 >>> os.path.isdir(os.path.join('/','Python32','README.txt'))
   4 False

Testez.

Au travail

Mettez d’abord au point un algorithme de parcours dans le système de fichier : de quelle structure s’agit-il (un arbre, oui, mais de quel genre) ? quel parcours faire ?

Écrivez alors une fonction :

   1 def cherche_fichier(dossier,nom):
   2         ...

qui renvoie la liste des chemins des fichiers nom accessibles à partir de dossier.

Extensions possibles

Si vous êtes à l’aise, vous pouvez considérer les extensions suivantes. Si vous avez déjà passé beaucoup de temps sur ce qui précède, mieux vaut passer à la tâche 2.

Permettre de rechercher un sous-mot

Si on cherche tous les fichiers python, la fonction précédente ne sert pas à grand chose. On voudrait utiliser des motifs du genre *.py. Ça tombe bien, il y a aussi une bibliothèque python pour ça : fnmatch.

   1 >>> import fnmatch
   2 >>> fnmatch.fnmatch('toto.py', '*.py')
   3 True
   4 >>> fnmatch.fnmatch('totopy', '*.py')
   5 False

Étendez la fonction de recherche en :

   1 def cherche_motif(dossier,motif):
   2         ...

Recherche multicritère: nom, taille, date, ...

On peut connaître la taille d’un fichier avec la fonction os.path.getsize. La date de dernière modification est obtenue avec os.getmtime.

Genéralisez la fonction de recherche en :

   1 def cherche_test(dossier,test):
   2         ...

test spécifie des critères à vérifier pour qu’un fichier soit retenu. On discutera ensemble des solutions possibles pour donner ces critères (c’est la seule vraie difficulté ici).

Tâche 2 : calcul de l’occupation du disque

On cherche maintenant à estimer l’espace disque occupé par le contenu d’un dossier (et de ses sous-dossiers).

Rappelons (?) que la taille d’un fichier est donnée par la fonction os.path.getsize :

   1 import os
   2 for fichier in os.listdir():
   3         print('{nom:20s}\t{taille:10d}'.format(
   4                 nom=fichier,
   5                 taille=os.path.getsize(fichier),
   6         ))

affichera la liste des fichiers du dossier courant ainsi que leur taille (en octets).

Au travail

Écrivez une fonction :

   1 def utilisation_disque(dossier):
   2     ...

qui renvoie la quantité d’espace disque (en octets) occupée par le contenu du dossier.

Extensions possibles

Écrivez une fonction :

   1 def affiche_utilisation_disque(dossier,profondeur):
   2     ...

qui affiche récursivement la taille occupée par les sous-dossiers, jusqu’à une profondeur fixée. L’affichage devrait reproduire l’arborescence.

Ajoutez des arguments optionnels pour :

  • trier les résultats par taille, ou par nom ;
  • spécifier une unité autre que l’octet ;
  • afficher des barres proportionnelles à la taille occupée par les sous-dossiers ;
  • générer (avec PIL) une représentation graphique de l’utilisation du disque dur (barres ou camembert).

Si ce qui précède n’a été qu’une promenade pour vous

Créez une interface graphique pour l’un des programmes précédents.

WikISN: Un arbre dans le disque dur (last edited 2013-05-22 12:33:28 by 194)