retrlines - Comprobando si el objeto en el servidor FTP es un archivo o directorio usando Python y ftplib
python ftp download (2)
Usando Python y ftplib, estoy escribiendo una función genérica para verificar si los elementos en un directorio FTP son archivos o directorios. Dado que el uso de la función MLSD podría no funcionar necesariamente con todos los servidores (uno de mis casos de uso no lo proporciona), he recurrido a esta forma efectiva pero cruda de determinarlo, al intentar cambiar el directorio al objeto y si el objeto es un archivo, se genera una excepción y el tipo de archivo se establece en consecuencia.
file_type = ''''
try:
ftp.cwd(item_name)
file_type = ''dir''
ftp.cwd(cur_path)
except ftplib.error_perm:
file_type = ''file''
He buscado en Internet y en la documentación de la biblioteca otros métodos, pero no puedo encontrar ninguno que funcione en la mayoría de los casos.
Por ejemplo, usando la función
dir
, puedo verificar si el primer carácter es
''d''
y esto podría determinarlo, sin embargo, una lectura adicional ha indicado que no todas las salidas tienen el mismo formato.
El mayor defecto que puedo ver en este método es si no tengo permiso para cambiar el directorio a la carpeta especificada; por lo tanto, se tratará como un archivo.
¿Hay algo que me falta o una forma más limpia de hacer esto?
Aquí hay una función que he usado a través de la versión FTP de
os.walk
para servidores FTP.
Aquí está el enlace de github si desea ver el código completo
https://github.com/Kasramvd/FTPwalk
:
def listdir(self, connection, _path):
file_list, dirs, nondirs = [], [], []
try:
connection.cwd(_path)
except:
return [], []
connection.retrlines(''LIST'', lambda x: file_list.append(x.split()))
for info in file_list:
ls_type, name = info[0], info[-1]
if ls_type.startswith(''d''):
dirs.append(name)
else:
nondirs.append(name)
return dirs, nondirs
Explicación:
Aquí, todo lo que necesita es recorrer los archivos y directorios dentro de su directorio deseado y elegir los directorios.
Pero como no puede hacer eso como lo hace en el sistema operativo, debe usar la función
ftplib.FTP.retrlines()
que recupera una lista de archivos o directorios en el modo de transferencia ASCII, luego puede separar los directorios analizando estas líneas.
No hay mejor manera (con el protocolo FTP en general, no solo con ftplib).
El
MLST
/
MLSD
es la única forma correcta y confiable.
Si no puede usar
MLST
/
MLSD
, probar
CWD
es la siguiente mejor opción.
Intentar analizar
LIST
es una opción alternativa.
Pero debe saber que el servidor utiliza el formato de listado que su programa comprende.