Accueil > Python > FTP > Récupérer un répertoire par FTP
Récupérer un répertoire par FTP
lundi 3 janvier 2011, par
Pour sauvegarder régulièrement mes sites web, j’utilise un script Python personnel. Une des étapes consiste à récupérer des fichier sur un serveur FTP. Comme j’ai eu un peu de mal à comprendre comment fonctionne le module FTP de Python, je vous livre ici ma solution.
J’ai décidé de créer une nouvelle classe ftp_perso
qui contiendra un ensemble de méthode. [1] Dérivée de la classe FTP
elle devrait permettre :
– de lister récursivement le contenu d’un répertoire.
– de récupérer récursivement le contenu d’un répertoire.
Un problème qui s’est posé est que tous les serveurs FTP ne renvoient pas le même type de chemin : certains renvoient un chemin depuis la racine, d’autres se contentent d’indiquer le nom du répertoire courant.
Pour résoudre cela, à l’initialisation d’une instance de classe, un attribut d’objet est calculé. self.hierarchie
: selon sa valeur, le parcours récursif ne sera pas effectué de la même manière, car il ne faudra pas envoyer les mêmes requêtes au serveur.
Par ailleurs certains listent les dossiers .
et ..
lorsqu’on envoie une commande ls. Comme il s’agit du répertoire courant et du répertoire parent, il ne faut pas les utiliser lorsqu’on parcourt récursivement, sinon on tourne. J’ai donc défini un attribut de d’objet, avec une valeur standard mais pouvant prendre de nouvelles valeurs à l’initialisation d’une instance : self.faux_reps
, qui contient la liste des dossiers à ne pas parcourir.
Enfin, il n’est pas toujours évident de savoir si un fichier est un répertoire (dossier) ou nom : j’ai donc défini une méthode is_dir(self, file)
que j’appelle sur chaque fichier avant de tenter d’y entrer comme un répertoire.
Au final j’ai donc :
– une méthode is_dir()
à usage interne.
– une méthode lister_repertoire(self,rep='',niveau=0)
qui permet de lister récursivement un répertoire. Cette méthode s’appelle elle même, d’où l’argument niveau
.
– une méthode rapatrier_repertoire(self,chemin_local='.',rep='',niveau=0)
qui permet de récupérer un répertoire distant en local.
Si vous voulez récuperer le code, attention à bien prendre celui dans le lien de téléchargement, sinon vous perdez les indentations.
[1] Si vous trouvez un nom mieux je suis preneur.