TD 3

Exercice 1 : Utilisation des modules os et os.path

  1. Commencer par regarder la documentation. Pour tester ces exercices, créer un répertoire contenant une arborescence de quelques sous-répertoires, fichiers (vides), et liens symboliques.

Exemple :

In [3]:
!ls -lR baz
baz:
total 12
-rw-r--r-- 1 jyt adm    0 oct.   3 11:53 a
-rw-r--r-- 1 jyt adm    0 oct.   3 11:53 b
drwxr-xr-x 2 jyt adm 4096 oct.   3 11:55 bla
-rw-r--r-- 1 jyt adm   10 oct.   3 11:57 blu
-rw-r--r-- 1 jyt adm    0 oct.   3 11:53 c
lrwxrwxrwx 1 jyt adm    6 oct.   3 11:56 link -> titi/d
drwxr-xr-x 2 jyt adm 4096 oct.   3 11:54 titi

baz/bla:
total 0
-rw-r--r-- 1 jyt adm 0 oct.   3 11:54 f
-rw-r--r-- 1 jyt adm 0 oct.   3 11:54 g

baz/titi:
total 0
-rw-r--r-- 1 jyt adm 0 oct.   3 11:54 d
-rw-r--r-- 1 jyt adm 0 oct.   3 11:54 e
  1. Écrire un programme qui fait la liste des fichiers (pas les répertoires!) présents dans un répertoire donné (répertoire et sous-répertoires). (Et qui affiche la liste, avec un nom par ligne ; exactement comme la commande find .). S'il fonctionne sur le répertoire de test, l'essayer sur votre répertoire racine.

  2. Indiquer le nombre de fichiers et le nombre de répertoires. (Comme si on exécutait la commande find . -type f | wc -l ; find . -type d | wc -l)

  3. Indiquer le nombre de fichiers, le nombre de répertoires, et le nombre de liens symboliques. (Si il y a un lien toto qui pointe vers le répertoire truc, alors toto compte uniquement comme un lien symbolique -- pas comme un répertoire ; et il ne faut pas descendre dans ses sous-répertoires.)

  4. Indiquer les mêmes nombres, mais en différenciant les éléments « publics » et les éléments « privés ». Un fichier est considéré comme « privé » si le groupe propriétaire et les autres utilisateurs n'ont aucun droit dessus ; sinon il est public.

Pour consulter les informations (taille, droits...) d'un fichier : struct_stat=os.stat(chemin_du_fichier) print struct_stat.st_size print struct_stat.st_mode

Pour vérifier qu'on est propriétaire d'un fichier : utiliser le champ st_uid et la fonction os.getuid.

Exercice 2 (modules os, sys, hashlib)

Il arrive souvent qu'un même fichier se retrouve présent avec des noms différents à divers emplacements. On peut, par exemple, avoir téléchargé plusieurs fois un même mp3 ou un document pdf, depuis des sites différents qui l'auront nommé différemment, et placé dans différents sous-répertoires.

Il peut être coûteux de comparer deux à deux de gros fichiers binaires, mais une fonction de hachage comme md5 ou sha1 permet de détecter les fichiers identiques avec une quasi-certitude (module hashlib). On demande d'écrire un script duplicates qui prend comme paramètres optionnels une extension de nom de fichier ( -e, --extension, defaut : None) un répertoire ( -d, --directory, défaut : répertoire courant) et un fichier de sortie (-o, --output, défaut : sortie standard), et renvoie les chemins complets vers les groupes de fichiers identiques, une ligne par fichier, et une ligne vide entre chaque groupe.

Par exemple :

jyt@drobie:~/monge> duplicates -e pdf -d tmp

tmp/f38w5635114j1957.pdf
tmp/qdesar.pdf

tmp/brunet.pdf
tmp/PhysRevE_68_041101.pdf

tmp/eis.pdf
tmp/JEDP_1999____A15_0.pdf

tmp/exos07.pdf
tmp/exos07-1.pdf
tmp/exos07-2.pdf

tmp/kshg21g4.pdf
tmp/be9kd6kh.pdf
tmp/uq8uiawn.pdf

Exercice 3 (module re)

La première étape de la construction d'un correcteur orthographique consiste à écrire une fonction qui vérifie si un mot est dans le dictionnaire (cf. TD1). La seconde consiste à proposer des corrections pour les mots qui n'y sont pas.

Deux mots u et v sont dits à distance d'édition 1 s'ils diffèrent par remplacement, insertion ou suppression d'un caractère.

Ecrire une fonction lookup(w) qui prend comme argument un mot arbitraire w et retourne la liste des mots du dictionnaire qui sont à distance 1 (ou 0) de w. On utilisera une expression régulière judicieusement construite. On pourra reprendre le dictionnaire du TD1.

Par exemple, on devrait avoir

>>> for x in lookup('ais'): print x,
... 
agis ai aie aies ail ails air airs ais aïs aise aisé aisy ait amis anis ans
apis ars as avis axis bais bis dais dis fais fis gais gis hais jais lais lis
mais mis nais ois pais pis rais ris sais sis tais vais vis
>>> 
In [ ]: