====== Python: FTP ======
En todas las notas se utiliza el módulo **ftplib**
===== Login =====
Iniciar sesión en un servidor FTP.
# Cogemos solo el objeto 'FTP' del módulo ftplib
from ftplib import FTP
ftp = FTP("servidor.ftp")
ftp.login("usuario", "contraseña")
# Cerramos la conexión
ftp.close()
Si el servidor FTP permite acceso anónimo, no tendríamos que poner ningún argumento en el método ''login()'', es decir: ''ftp.login()''
===== Listar ficheros =====
El método ''nlst()'' devuelve una lista con los ficheros y directorios del servidor FTP.
ftp.nlst()
# Resultado:
# ['.', '..', 'directorio', 'archivo.txt']
# Podemes especificar el directorio que queremos listar:
ftp.nlst("directorio")
==== Navegar ====
Para movernos por directorios, utilizamos el método ''cwd()'':
ftp.cwd("directorio")
==== Descargar ficheros ====
Descarga de un fichero:
from ftplib import FTP
import os
ftp.cwd("directorio")
# Directorio local donde se descargará el fichero
os.chdir("/home/usuario/datos")
with open("archivo.txt", "wb") as file:
ftp.retrbinary("RETR archivo.txt", file.write)
===== Ejemplos =====
Descarga de un fichero:
from ftplib import FTP
import os
def ftpDownloader(archivo, host, user, password):
ftp = FTP(host)
ftp.login(user, password)
ftp.cwd("datos")
os.chdir("/home/usuario/datos")
with open(archivo, "wb") as file:
ftp.retrbinary("RETR %s" % archivo, file.write)
Descarga de varios ficheros:
from ftplib import FTP, error_perm
import os
# La siguiente función descargará todo lo que hay dentro de directorio
# 'Data' que sigue el siguiente formato 'año/id/id-año.gz'
def ftpDownloader(id, startYear, endYear, url, user, password):
ftp = FTP(url)
ftp.login(user,password)
if not os.path.exists("/home/usuario/directorio"):
os.makedirs("/home/usuario/directorio")
os.chdir("/home/usuario/directorio")
for year in range(startYear, endYear+1):
fullpath='/Data/%s/%s-%s.gz' % (year, id, year)
filename = os.path.basename(fullpath)
try:
with open(filename,"wb") as file:
ftp.retrbinary('RETR %s' % fullpath, file.write)
print("%s succesfully downloaded" % filename)
except error_perm:
print("%s is not available" % filename)
os.remove(filename)
ftp.close()