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_name
lo 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.