¿Por qué no usas la opción de siguiente directorio?
ftp.dir('-t',data.append)
Con esta opción, la lista de archivos se ordena por tiempo del más nuevo al más antiguo. Luego simplemente recupere el primer archivo de la lista para descargarlo.
Para aquellos que buscan una solución completa para encontrar el archivo más reciente en una carpeta:
MLSD
Si su servidor FTP admite MLSD
comando, una solución es fácil:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
LISTA
Si necesita confiar en un LIST
obsoleto comando, tiene que analizar una lista propietaria que devuelve.
La lista común de *nix es como:
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip
-rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
Con una lista como esta, este código servirá:
from dateutil import parser
# ...
lines = []
ftp.dir("", lines.append)
latest_time = None
latest_name = None
for line in lines:
tokens = line.split(maxsplit = 9)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
if (latest_time is None) or (time > latest_time):
latest_name = tokens[8]
latest_time = time
print(latest_name)
Este es un enfoque bastante frágil.
MDTM
Una forma más confiable, pero menos eficiente, es usar MDTM
comando para recuperar marcas de tiempo de archivos/carpetas individuales:
names = ftp.nlst()
latest_time = None
latest_name = None
for name in names:
time = ftp.voidcmd("MDTM " + name)
if (latest_time is None) or (time > latest_time):
latest_name = name
latest_time = time
print(latest_name)
Para una versión alternativa del código, vea la respuesta de @Paulo.
Conmutador -t no estándar
Algunos servidores FTP admiten un -t
propietario no estándar interruptor para NLST
(o LIST
) comando.
lines = ftp.nlst("-t")
latest_name = lines[-1]
Consulte Cómo obtener archivos en la carpeta FTP ordenados por hora de modificación.
Descargando archivo encontrado
Independientemente del enfoque que utilice, una vez que tenga el latest_name
, lo descargas como cualquier otro archivo:
with open(latest_name, 'wb') as f:
ftp.retrbinary('RETR '+ latest_name, f.write)
Véase también
- Obtenga el último nombre de la carpeta FTP en Python
- Cómo obtener la hora de modificación del archivo FTP usando Python ftplib
Con NLST
, como se muestra en la respuesta de Martin Prikryl, debe usar sorted
método:
ftp = FTP(host="127.0.0.1", user="u",passwd="p")
ftp.cwd("/data")
file_name = sorted(ftp.nlst(), key=lambda x: ftp.voidcmd(f"MDTM {x}"))[-1]