descargar - Python ftp lista solo directorios y no archivos
ftplib (4)
Me gustaría enumerar todos los directorios en un directorio ftp y luego ingresar cada uno de ellos. El problema es que mi código también incluye un archivo e intenta ingresarlos también.
- ¿Hay alguna forma de obtener un valor de retorno del método ftp.cwd?
- ¿Hay alguna manera de obtener solo el nombre del directorio, o hay una forma mejor de hacer lo que quiero?
Aquí está el código que estoy usando ahora:
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(''../'')
Esto es un poco feo, pero el ftplib
parece no ser muy fácil de usar.
>>> 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/'']
Eso funcionó para mí:
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
Aquí hay una solución de Python 3.3 (mlsd): http://docs.python.org/3/library/ftplib.html#ftplib.FTP.mlsd
ftp.nlst y ftp.dir están "En desuso desde la versión 3.3: use mlsd () en su lugar".
El protocolo FTP no tiene una forma de distinguir entre directorios y archivos (como para el listado). Creo que la mejor opción sería intentar y fallar
try:
ftp.cwd(name)
except ftplib.error_perm as detail:
print("It''s probably not a directory:", detail)
De lo contrario, es posible que desee analizar el resultado de la lista del directorio. Sin embargo, esto no será independiente de la plataforma, porque las listas de directorios difieren de OS a OS. Como se muestra aquí ...