76 votes

Utiliser ftplib de Python pour obtenir une liste de répertoires, de manière portable

Vous pouvez utiliser ftplib pour la pleine prise en charge de FTP en Python. Cependant, le moyen privilégié d'obtenir une liste de répertoires est:

# File: ftplib-example-1.py

import ftplib

ftp = ftplib.FTP("www.python.org")
ftp.login("anonymous", "ftplib-example-1")

data = []

ftp.dir(data.append)

ftp.quit()

for line in data:
    print "-", line

Ce qui donne:

$ python ftplib-example-1.py
- total 34
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 .
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 ..
- drwxrwxr-x   2 root     4127         512 Sep 13 15:18 RCS
- lrwxrwxrwx   1 root     bin           11 Jun 29 14:34 README -> welcome.msg
- drwxr-xr-x   3 root     wheel        512 May 19  1998 bin
- drwxr-sr-x   3 root     1400         512 Jun  9  1997 dev
- drwxrwxr--   2 root     4127         512 Feb  8  1998 dup
- drwxr-xr-x   3 root     wheel        512 May 19  1998 etc
...

Je suppose que l'idée est d'analyser les résultats afin d'obtenir l'inscription à l'annuaire. Cependant, cette liste est directement dépendante sur le serveur FTP du moyen de mise en forme de la liste. Il serait très salissant à écrire du code pour cela avoir à anticiper toutes les différentes façons dont les serveurs FTP peut format de cette liste.

Est-il un portable de façon à obtenir un tableau rempli avec l'inscription à l'annuaire?

(Le tableau ne doit avoir que les noms de dossier.)

147voto

William Keller Points 2845

Essayez d'utiliser ftp.nlst(dir) .

Cependant, notez que si le dossier est vide, une erreur risque de se produire:

 files = []

try:
    files = ftp.nlst()
except ftplib.error_perm, resp:
    if str(resp) == "550 No files found":
        print "No files in this directory"
    else:
        raise

for f in files:
    print f
 

35voto

Giampaolo Rodolà Points 2965

Le fiable/méthode normalisée pour analyser FTP inscription à l'annuaire est d'utiliser la commande MLSD, qui maintenant doit être pris en charge par tous les récents/décent serveurs FTP.

import ftplib
f = ftplib.FTP()
f.connect("localhost")
f.login()
ls = []
f.retrlines('MLSD', ls.append)
for entry in ls:
    print entry

Le code ci-dessus affichera:

modify=20110723201710;perm=el;size=4096;type=dir;unique=807g4e5a5; tests
modify=20111206092323;perm=el;size=4096;type=dir;unique=807g1008e0; .xchat2
modify=20111022125631;perm=el;size=4096;type=dir;unique=807g10001a; .gconfd
modify=20110808185618;perm=el;size=4096;type=dir;unique=807g160f9a; .skychart
...

À partir de python 3.3, ftplib fournira une méthode spécifique pour ce faire:

2voto

Garth Kidd Points 2792

Il n'y a pas de standard pour la mise en page de l' LIST de réponse. Vous devez écrire du code pour gérer les plus populaires mises en page. J'aimerais commencer avec Linux, ls et Windows Server DIR formats. Il y a beaucoup de variété là, cependant.

Retour à l' nlst méthode (en retournant le résultat de l' NLST commande) si vous ne pouvez pas analyser la liste la plus longue. Pour les points de bonus, de triche: peut-être le plus long numéro de la ligne contenant un fichier connu de nom, c'est sa durée.

1voto

Steve Saporta Points 155

Il m'arrive d'être coincé avec un serveur FTP (Rackspace Cloud Sites serveur virtuel) qui ne semble pas à l'appui de MLSD. Pourtant, j'ai besoin de plusieurs champs d'informations de fichier, comme la taille et de l'heure, et pas seulement le nom de fichier, donc je dois utiliser la commande DIR. Sur ce serveur, la sortie de DIR ressemble beaucoup à l'OP. Dans le cas où il aide à quelqu'un, voici un peu de Python classe qui analyse une ligne de sortie pour obtenir le nom de fichier, la taille et l'horodatage.

import datetime

class FtpDir:
    def parse_dir_line(self, line):
        words = line.split()
        self.filename = words[8]
        self.size = int(words[4])
        t = words[7].split(':')
        ts = words[5] + '-' + words[6] + '-' + datetime.datetime.now().strftime('%Y') + ' ' + t[0] + ':' + t[1]
        self.timestamp = datetime.datetime.strptime(ts, '%b-%d-%Y %H:%M')

Pas très portable, je sais, mais il est facile d'étendre ou de modifier à traiter avec différents serveurs FTP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X