Ftp список Python только каталоги, а не файлы - PullRequest
3 голосов
/ 29 мая 2011

Я хотел бы перечислить все каталоги в каталоге ftp и затем ввести каждый из них. Проблема в том, что мой код также выводит список файлов и пытается также ввести их.

  1. Есть ли способ получить возвращаемое значение из метода ftp.cwd?
  2. Есть ли способ получить только имя каталога, или есть лучший способ сделать то, что я хочу.

Вот код, который я сейчас использую:

    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('../')

Ответы [ 4 ]

5 голосов
/ 29 мая 2011

Протокол FTP не позволяет различать каталоги и файлы (как в случае листинга). Я думаю, что лучшая ставка была бы либо, попробуйте и потерпите неудачу

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

В противном случае вы можете проанализировать вывод из списка каталогов. Это не будет зависеть от платформы, потому что списки каталогов отличаются от ОС к ОС. Как показано здесь ...

2 голосов
/ 22 мая 2013

Вот решение Python 3.3 (mlsd): http://docs.python.org/3/library/ftplib.html#ftplib.FTP.mlsd

ftp.nlst и ftp.dir "устарели с версии 3.3: используйте взамен mlsd ()."

1 голос
/ 29 мая 2011

Это немного уродливо, но ftplib кажется не очень простым в использовании.

>>> 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 голосов
/ 07 октября 2011

Это сработало для меня:

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