2009-02-25 13 views
5

Python ma standardowy moduł biblioteczny ftplib do uruchamiania komunikacji FTP. Ma dwa sposoby na uzyskanie listy zawartości katalogu. Jeden, FTP.nlst(), zwróci listę zawartości katalogu z nazwą katalogu jako argumentem. (Zwróci nazwę pliku, jeśli zostanie podana zamiast niego nazwa pliku.) Jest to niezawodny sposób wyświetlania zawartości katalogu, ale nie daje żadnego wskazania, czy każdy element na liście jest plikiem lub katalogiem. Druga metoda to FTP.dir(), która podaje sformatowany ciąg zawartości katalogu w katalogu podanym jako argument (lub atrybutów pliku, z podaniem nazwy pliku).Ustal, czy listing jest katalogiem lub plikiem w Pythonie za pośrednictwem FTP

Według a previous question on Stack Overflow parsowanie wyników dir() może być niestabilne (różne serwery mogą zwracać różne ciągi). Poszukuję sposobu na wylistowanie tylko katalogów znajdujących się w innym katalogu za pośrednictwem FTP. Zgodnie z moją wiedzą, skrobanie dla d w części dotyczącej uprawnień jest jedynym rozwiązaniem, które wymyśliłem, ale nie mogę zagwarantować, że uprawnienia pojawią się w tym samym miejscu między różnymi serwerami. Czy istnieje bardziej niezawodne rozwiązanie do identyfikowania katalogów przez FTP?

Odpowiedz

10

Niestety FTP nie ma polecenia do wyświetlenia tylko folderów, więc analiza wyników uzyskanych z ftp.dir() byłaby "najlepsza".

Prosta aplikacja przy założeniu standardowego wynik z ls (nie ftp Windows)

from ftplib import FTP 

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

Standard FTP Commands

Custom FTP Commands

1

Jeśli serwer FTP obsługuje komendę MLSD, należy sprawdzić that odpowiedź dla kilku użytecznych klas (FTPDirectory i FTPTree).

0

Innym sposobem jest założenie, że wszystko jest katalogiem i spróbuj go zmienić. Jeśli się to uda, jest to katalog, ale jeśli to spowoduje, że jest to plik ftplib.error_perm, prawdopodobnie jest to plik. Możesz złapać, a następnie złap wyjątek. Oczywiście, to nie jest tak naprawdę najbezpieczniejsze, ale żadne z nich nie analizuje zwariowanego łańcucha dla wiodących "d's".

Przykład

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 
Powiązane problemy