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.

  2. É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.

  3. 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)

  4. 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.)

  5. 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
>>> 

Exercice 4 (modules urllib,HTMLParser, time)

Écrire un script qui prend comme paramètre une url et télécharge dans le répertoire courant toutes les images contenues dans la page.

On utilisera urllib pour récupérer le code html, une classe dérivée de HTMLParser pour récupérer les attributs src de toutes les balises img, et le module urlparse pour construire l'url de téléchargement de chaque image.

Comme des images provenant de sites différents peuvent avoir le même nom, on utilisera le module time pour préfixer au nom du fichier la date et l'heure du téléchargement. Le résultat pourra ressembler à ceci :

$ dnld-imgs http://www-igm.univ-mlv.fr/~jyt/
$ ls -l
-rw-r--r-- 1 jyt adm    130 janv.  5 16:10 2014-01-05_16-10-14_barre.gif
-rw-r--r-- 1 jyt adm   1587 janv.  5 16:10 2014-01-05_16-10-14_iuf.gif
-rw-r--r-- 1 jyt adm   2344 janv.  5 16:10 2014-01-05_16-10-14_logoCNRS.jpg
-rw-r--r-- 1 jyt adm   4153 janv.  5 16:10 2014-01-05_16-10-14_logoigm.gif
-rw-r--r-- 1 jyt adm    553 janv.  5 16:10 2014-01-05_16-10-14_mail.gif
-rw-r--r-- 1 jyt adm  13462 janv.  5 16:10 2014-01-05_16-10-14_thibon.gif
-rw-r--r-- 1 jyt adm   4554 janv.  5 16:10 2014-01-05_16-10-14_titre-petit.jpg
-rw-r--r-- 1 jyt adm   3196 janv.  5 16:10 2014-01-05_16-10-15_scholar_sm.gif
On pourra ensuite ajouter des options ad libitum, par exemple un répertoire de téléchargement, un préfixe autre que la date et l'heure, etc.
N.B. En Python 3 :
 from html.parser import HTMLParser 
In [ ]: