2009-02-25 20 views
5

Python tiene un módulo de biblioteca estándar ftplib para ejecutar comunicaciones FTP. Tiene dos formas de obtener una lista de los contenidos del directorio. Uno, FTP.nlst(), devolverá una lista de los contenidos de un directorio dado un nombre de directorio como argumento. (Devolverá el nombre de un archivo si se le asigna un nombre de archivo). Esta es una forma sólida de mostrar el contenido de un directorio, pero no da ninguna indicación de si cada elemento de la lista es un archivo o directorio. El otro método es FTP.dir(), que proporciona una lista con formato de cadena del contenido del directorio del directorio dado como argumento (o de los atributos del archivo, dado un nombre de archivo).Determinar si una lista es un directorio o archivo en Python a través de FTP

De acuerdo con a previous question on Stack Overflow, el análisis de los resultados de dir() puede ser frágil (diferentes servidores pueden devolver diferentes cadenas). Sin embargo, estoy buscando una forma de enumerar solo los directorios contenidos en otro directorio a través de FTP. Que yo sepa, el raspado de un d en la parte de permisos de la cadena es la única solución que he encontrado, pero supongo que no puedo garantizar que los permisos aparezcan en el mismo lugar entre los diferentes servidores. ¿Existe una solución más sólida para identificar directorios a través de FTP?

Respuesta

10

Desafortunadamente, FTP no tiene un comando para listar solo carpetas, por lo que analizar los resultados que obtenga de ftp.dir() sería 'mejor'.

Una simple aplicación asumiendo un resultado estándar de ls (no es un ftp ventanas)

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

Si el servidor FTP soporta el comando MLSD, entonces por favor revise that respuesta para un par de clases útiles (FTPDirectory y FTPTree).

0

Otra forma es asumir que todo es un directorio e intentar cambiarlo. Si esto tiene éxito, es un directorio, pero si arroja un ftplib.error_perm, probablemente sea un archivo. Puede atrapar y atrapar la excepción. Claro, esto no es realmente lo más seguro, pero tampoco está analizando la cadena loca de los principales 'd's.

Ejemplo

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 
Cuestiones relacionadas