Определите, является ли листинг каталогом или файлом в Python через FTP - PullRequest
6 голосов
/ 25 февраля 2009

Python имеет стандартный библиотечный модуль ftplib для запуска FTP-связи. У него есть два способа получения списка содержимого каталога. Один, FTP.nlst(), вернет список содержимого каталога с указанным именем каталога в качестве аргумента. (Он вернет имя файла, если вместо него будет указано имя файла.) Это надежный способ составить список содержимого каталога, но не дает никаких указаний на то, является ли каждый элемент в списке файлом или каталогом. Другой метод - FTP.dir(), который дает строковый форматированный список содержимого каталога, заданного в качестве аргумента (или атрибутов файла, заданных именем файла).

Согласно предыдущему вопросу о переполнении стека , анализ результатов dir() может быть хрупким (разные серверы могут возвращать разные строки). Однако я ищу какой-то способ перечисления только каталогов, содержащихся в другом каталоге по FTP. Насколько мне известно, получение значения d в части разрешений строки - единственное решение, которое я придумала, но я не могу гарантировать, что разрешения будут появляться в одном и том же месте между разными сервера. Есть ли более надежное решение для идентификации каталогов по FTP?

Ответы [ 3 ]

10 голосов
/ 25 февраля 2009

К сожалению, на FTP нет команды для вывода списка папок, поэтому анализ результатов, полученных из ftp.dir (), будет «лучшим».

Простое приложение, принимающее стандартный результат от ls (не windows ftp)

from ftplib import FTP

ftp = FTP(host, user, passwd)
for r in ftp.dir():
    if r.upper().startswith('D'):
        print r[58:]  # Starting point

Стандартные команды FTP

Пользовательские команды FTP

1 голос
/ 08 января 2013

Другой способ - предположить, что все является каталогом, и попытаться изменить его. Если это удастся, это каталог, но если он выбрасывает ftplib.error_perm, это, вероятно, файл. Вы можете поймать, а затем поймать исключение. Конечно, это не самый безопасный способ, но он также не разбирает сумасшедшую строку за ведущие слова.

Пример

def processRecursive(ftp,directory):
    ftp.cwd(directory)
    #put whatever you want to do in each directory here
    #when you have called processRecursive with a file, 
    #the command above will fail and you will return


    #get the files and directories contained in the current directory
    filenames = []
    ftp.retrlines('NLST',filenames.append)
    for name in filenames:
        try:
            processRecursive(ftp,name)
        except ftplib.error_perm:
            #put whatever you want to do with files here

    #put whatever you want to do after processing the files 
    #and sub-directories of a directory here
1 голос
/ 25 июня 2010

Если FTP-сервер поддерживает команду MLSD, проверьте , что отвечает за пару полезных классов (FTPDirectory и FTPTree).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...