2011-05-29 4 views
3

Je voudrais lister tous les répertoires dans un répertoire ftp, puis entrer chacun d'entre eux. Le problème est que mon code liste aussi le fichier et essaie de les entrer aussi.Python ftp liste uniquement les répertoires et non les fichiers

  1. Existe-t-il un moyen d'obtenir une valeur de retour à partir de la méthode ftp.cwd?
  2. Existe-t-il un moyen d'obtenir seulement le nom du répertoire en premier lieu, ou il y a une meilleure façon de faire ce que je veux.

Voici le code que je suis maintenant en utilisant:

from ftplib import FTP 
    ftp = FTP('ftp.overtherainbow.com') 
    ftp.login() 
    for name in ftp.nlst(): 
     print "listing: " + name 
     ftp.cwd(name) 
     ftp.retrlines('LIST') 
     ftp.cwd('../') 

Répondre

4

Le protocole FTP ne dispose pas d'une façon de faire la distinction entre les répertoires et fichiers (comme la liste). Je pense que le mieux serait non plus, essayez et ne parviennent

try: 
    ftp.cwd(name) 
except ftplib.error_perm as detail: 
    print("It's probably not a directory:", detail) 

Ou sinon vous pouvez analyser la sortie de la liste des répertoires. Toutefois, cela ne sera pas indépendant de la plate-forme, car les listes de répertoires diffèrent d'OS à OS. Comme le montre here...

1

Ceci est un peu moche, mais le ftplib semble pas très facile à utiliser.

>>> x=[] 
>>> ftp.dir('-d','*/',lambda L:x.append(L.split()[-1])) 
>>> x 
['access-logs/', 'etc/', 'mail/', 'perl/', 'proxy/', 'public_ftp/', 'public_html/', 'subversion/', 'tmp/', 'web/', 'www/'] 
0

Cela a fonctionné pour moi:

def get_current_dir_subdirs(self): 
    ret = [] 
    self.ftp.dir("",ret.append) 
    ret = [x.split()[-1] for x in ret if x.startswith("d")] 
    return ret 
Questions connexes