SkayaWiki

PythonTD2

JeromePetazzoni :: DerniersChangements :: DerniersCommentaires? :: ParametresUtilisateur :: http://www.enix.org/ :: Vous êtes ec2-13-58-61-176.us-east-2.compute.amazonaws.com
Ceci est une version archivée de PythonTD2 à 2006-02-08 14:09:00.
Écrire un programme qui fait la liste des fichiers (pas les répertoires!) présents dans le compte de l'utilisateur (répertoire et sous-répertoires).

On veut implémenter un mode « privé » optionnel. Dans le mode privé, on n'indexera que les fichiers qui sont aussi lisibles par les autres utilisateurs. Autrement dit : on n'indexera pas les fichiers que l'on possède et qu'on est le seul à pouvoir lire.

Modifier le programme pour que les fichiers « privés » soient masqués lorsque la variable d'environnement PYNDEXER_PRIVACY vaut une des valeurs suivantes : t, y, yes, true, on, o, vrai, v.

Rappel : 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.

Pour décomposer le travail :
- fonction check_file_is_public(fullpath)
- fonction check_dir_is_public(fullpath) sera récursive et utilisera os.path.dirname



Modifier le programme pour qu'il sauve la liste des fichiers dans ~/.pyndexer/list (créer le répertoire si nécessaire, et écraser l'ancienne liste si elle existe). On appellera ce premier programme pyndexer_mklist.py (pour le format de la liste : on pourra prendre par exemple un nom de fichier par ligne, ou bien les séparer avec des \0, ou encore utiliser pickle comme vu en cours).



Écrire un second programme, pyndexer_locate.py, qui lira la liste stockée de le fichier évoqué ci-dessus, et cherchera dedans le(s) fichier(s) dont le nom contient toutes les chaînes spécifiées sur la ligne de commande.
Exemple : pyndexer_locate.py mp3 pink floyd doit afficher tous les noms (avec le chemin) des fichiers dont le nom contient "mp3", "pink" et "floyd" (dans n'importe quel ordre).

Implémenter deux méthodes pour le programe "locate" : l'une utilisant des regex, l'autre non ; et comparer la vitesse d'exécution (utiliser pour celà la commande shell time). Réfléchir aux possibilités d'optimisation...



Écrire un troisième programme, pyndexer_mkmeta.py, qui va parcourir la liste générée par pyndexer_mklist.py, et si un fichier s'appelle .java, .c, .txt, .html (allonger la liste des extensions si nécessaire afin d'englober un maximum de fichiers texte), on va le découper en tokens (prendre comme séparateur tous les caractères non-alphanumériques), et créer un index primitif, sous la forme d'une table de hachage dont les clés seront les tokens (=mots) et les valeurs seront une liste de fichiers contenant le mot. Par exemple, pour les deux fichiers:
toto (contenant une seule ligne : 1+1=4)
titi (contenant une seule ligne : 4 quarts)
On aura la table de hachage : {"1": ["toto"], "4": ["toto", "titi"], "quarts": ["titi"]}
Une fois générée, cette table sera sauvée dans ~/.pyndexer/meta (utiliser le format qui vous semblera le plus pratique!)



Écrire un quatrième programme, pyndexer_search.py, qui chargera le fichier "meta" et indiquera tous les fichiers contenant tous les mots contenus sur la ligne de commande.
Exemple : pyndexer_search.py class ray surface square doit donner le nom de tous les fichiers qui contiennent tous les mots "class", "ray", "surface" et "square" n'importe où dans le fichier (peu importe dans quel ordre).



Modifier mkmeta pour indexer les documents openoffice (en utilisant le module zip).
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]