2009-02-25 8 views
5

Python dispone di un modulo libreria standard ftplib per eseguire comunicazioni FTP. Ha due modi per ottenere un elenco di contenuti di directory. Uno, FTP.nlst(), restituirà un elenco dei contenuti di una directory che fornisce un nome di directory come argomento. (Verrà invece restituito il nome di un file se viene fornito un nome file.) Questo è un modo efficace per elencare il contenuto di una directory ma non fornisce alcuna indicazione sul fatto che ciascun elemento nell'elenco sia un file o una directory. L'altro metodo è FTP.dir(), che fornisce una lista formattata a stringa del contenuto della directory della directory fornita come argomento (o degli attributi del file, dato un nome di file).Determina se un elenco è una directory o un file in Python su FTP

Secondo a previous question on Stack Overflow, l'analisi dei risultati di dir() può essere fragile (diversi server possono restituire stringhe diverse). Sto cercando un modo per elencare solo le directory contenute in un'altra directory tramite FTP, però. Per quanto ne so, raschiare per un d nella parte delle autorizzazioni della stringa è l'unica soluzione che ho trovato, ma suppongo che non posso garantire che le autorizzazioni appariranno nello stesso posto tra diversi server. C'è una soluzione più robusta per identificare le directory su FTP?

risposta

10

Sfortunatamente FTP non ha un comando per elencare solo le cartelle, quindi l'analisi dei risultati ottenuti da ftp.dir() sarebbe "migliore".

Una semplice applicazione ipotizzando un risultato normale da LS (non un ftp finestre)

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

Se il server FTP supporta il comando MLSD, quindi si prega di controllare that risposta per un paio di classi utili (FTPDirectory e FTPTree).

0

Un altro modo è supporre che tutto sia una directory e provare a modificarlo. Se questo succede è una directory, ma se questo genera un ftplib.error_perm è probabilmente un file. Puoi catturare e poi prendere l'eccezione. Certo, questo non è davvero il più sicuro, ma nessuno dei due sta analizzando la stringa pazzesca per condurre 'd's.

Esempio

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 
Problemi correlati