Saltar al contenido

Python FTP obtiene el archivo más reciente por fecha

Esta noticia ha sido analizado por nuestros especialistas para que tengas la garantía de la exactitud de nuestra esta sección.

Solución:

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 obsoleto LIST comando, tiene que analizar una lista propietaria que devuelve.

La lista común * 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 manera 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 propietario no estándar -t interruptor para NLST (o LIST) dominio.

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 la latest_namelo descargas como cualquier otro archivo:

file = open(latest_name, 'wb')
ftp.retrbinary('RETR '+ latest_name, file.write)

Ver también

  • Obtenga el último nombre de la carpeta FTP en Python
  • Cómo obtener el tiempo de modificación del archivo FTP usando Python ftplib

¿Por qué no usas la siguiente opción de 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 en la lista para descargarlo.

con NLST, como la respuesta de Martin Prikryl: debe usar el método ordenado:

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]

Si para ti ha sido de provecho nuestro artículo, te agradeceríamos que lo compartas con el resto programadores de esta manera nos ayudas a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *