GNU/Linux >> Tutoriales Linux >  >> Linux

Python FTP obtiene el archivo más reciente por fecha

¿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]

Linux
  1. Linux:¿cómo obtener la fecha de creación de un archivo en un volumen lógico Ntfs?

  2. ¿El método más eficiente para vaciar el contenido de un archivo?

  3. Obtenga el tiempo de creación de archivos con Python en Linux

  4. cómo encontrar el propietario de un archivo o directorio en python

  5. Cómo obtener formato de fecha y hora en python

Cómo obtener la fecha y hora actuales en Python

Cómo aprovechar al máximo Qmmp 1.0

Obtenga el archivo más reciente en un directorio en Linux

¿Obtener mtime de un archivo específico usando Bash?

¿Cómo obtener la fecha/hora de creación del archivo en Bash/Debian?

Uso de la cola para seguir un archivo sin mostrar las líneas más recientes