python - example - Obtener el tamaño de la carpeta usando FtpLib
python 3.6 ftp (3)
Después de algunos intentos de prueba encontré la solución.
Se basa en la solución de Alex Thorntons, pero tuve en cuenta que podría haber subcarpetas. Cuando se trata de una carpeta, el ftp.cwd()
tiene éxito y la función se llama recursivamente.
Cuando el ftp.cwd()
arroja un error, era un archivo y podemos obtener el tamaño del archivo. El tipo está configurado en "I" (imágenes), esto fuerza el modo binario ya que el ftp.size()
no está permitido en modo ASCII.
def get_total_size(self, directory):
size = 0
for filename in self.ftp.nlst(directory):
try:
self.ftp.cwd(filename)
size += self.get_total_size(filename)
except:
self.ftp.voidcmd(''TYPE I'')
size += self.ftp.size(filename)
return size
Estoy usando FtpLib (Python) para descargar una carpeta con archivos de un servidor ftp. Pero quiero saber el tamaño de la carpeta antes de comenzar a descargarla.
En la documentación encontré FTP.size(filename)
pero eso es solo para archivos y no para carpetas ... Podría recorrer todos los archivos de la carpeta, pero es posible que la carpeta contenga subcarpetas.
Entonces, ¿alguien sabe cómo obtener el tamaño de la carpeta usando FtpLib?
def get_size(directory):
size = 0
for file in FTP.nlst(directory):
size += FTP.size(file)
return size
La solución de Frederik Voordeckers no funcionó para mí. Cuando se llama al método recursivamente, cuando se trata de una estructura de subcarpetas, se genera el 550 directory/.../sub_directory: No such file or directory
error 550 directory/.../sub_directory: No such file or directory
.
Modifiqué su código original, borrando las "autodeclaraciones", ya que no usé el método dentro de una clase. Esto pudo haber causado el error. No lo sé.
Aquí está mi solución:
def get_total_size(ftp_dir):
size = 0
parent_dir = ftp.pwd() # get the current directory
for filename in ftp.nlst(ftp_dir):
# (don''t forget to import os)
path = os.path.join(parent_dir, filename) # keeps recursively track of the path
try:
ftp.cwd(path)
size += get_total_size(path)
ftp.cwd(parent_dir)
except:
ftp.voidcmd(''TYPE I'')
size += ftp.size(path)
return size
Debería funcionar como un encanto para todos.