Lorsque l’on travaille sur des tâches au niveau système, on doit régulièrement appliquer une même action à tous les fichiers (Python) d’un même type : archivage, compter le nombre de lignes de code, supprimer tous les fichiers log ayant plus de 30 jours, etc...
PARCOURIR LES ENTREES D’UN REPERTOIRE
> listdir
Le package ‘os’ fournit la fonction ‘listdir’ qui, pour un nom de répertoire donné, retourne la liste de noms de fichiers/répertoires présents dans ce répertoire. Voici un exemple d’utilisation :
> walk
‘walk’ est un itérateur qui permet à l’utilisateur de s’affranchir du parcours récursif du répertoire.
Cette fonction alloue de nombreuses listes de chaînes de caractères.
> scandir
Depuis Python 3.4, la méthode conseillée est ‘scandir’ car elle est beaucoup plus efficace. J’ai pu constater un gain de performance de x20 sur des cas complexes d’utilisation…
L’utilisation contextuelle avec ‘with’ est importante, elle garantit la libération des ressources ouvertes. L’itérateur obtenu avec ‘scandir’ permet de parcourir des instances d’objet de type os.DirEntry (Plus de détail ici) grâce auquel on peut accéder à différentes fonctions/propriétés permettant de connaître la nature de l’entrée (fichier, répertoire ou lien symbolique) ou des informations comme les dates et tailles.
REUTILISATION
L’idée consiste à créer une fonction ‘filemap’ qui va parcourir récursivement une arborescence et appliquer une action sur tous les fichiers qui sont une cible. On pourra ainsi réutiliser cette fonction dans différents contextes…
Le paramètre ‘action’ est utilisé pour passer une fonction callback qui prendra en entrée l’instance d’un objet de type os.DirEntry. Cette fonction appliquera une action (le supprimer, le déplacer, etc…) sur un fichier. Voici un exemple d’utilisation :
On affiche le nom de chaque fichier source Python présent dans l’arborescence de « C:\Temp ».
Cet article sur la gestion avancées des fichiers (Python) vous est proposé par l'expertise Python d'Invivoo.
COMPTER LES FICHIERS
Compter les fichiers est un besoin qui présente un intérêt d’un point de vue fonctionnel (valider que le nombre de fichiers générés par la production est identique à l’attendu) mais aussi sur le plan informatique car il nous amènera à mieux penser notre code. L’implémentation naïve serait :
‘count_file’ permet effectivement de compter les fichiers mais elle ne respecte pas le concept de pureté de la programmation fonctionnelle car elle dépend d’une variable globale. Si j’oubliais de réinitialiser ‘count’ entre 2 appels à ‘filemap’ j’obtiendrais un résultat incorrect.
Pour corriger ce problème, Python dispose d’un outil très intéressant : on peut créer des objets qui se comporte comme des fonctions. Grâce à l’objet on va pouvoir stocker l’état du compteur tout en préservant la pureté...
La fonction ‘__call__’ est l’action qui sera appelée et qui permet l’objet de se comporter comme une fonction.
LE CIBLAGE
> Ciblage par les extensions
Dans notre exemple précédent, nous avons ciblé les fichiers sources Python grâce à une fonction lambda :
C’est régulièrement que l’on va avoir besoin de cibler les fichiers via leur extension. Il nous faudrait avoir un moyen plus simple et plus rapide pour cibler un type d’extension ou un groupe d’extensions. La solution pythonique par excellence sera fourni par un générateur de fonction :
> Ciblage par la date de création
Lorsque l’on gère des arborescences de production, on est souvent amené à mettre en place des outils de suppression des fichiers en fonction de leurs dates de créations : on supprime les fichiers créés il y a plus de 30 jours.