Perché non usi l'opzione next dir?
ftp.dir('-t',data.append)
Con questa opzione l'elenco dei file è ordinato dal più recente al meno recente. Quindi basta recuperare il primo file nell'elenco per scaricarlo.
Per coloro che cercano una soluzione completa per trovare l'ultimo file in una cartella:
MLSD
Se il tuo server FTP supporta MLSD
comando, una soluzione è facile:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
LISTA
Se hai bisogno di fare affidamento su un LIST
obsoleto comando, devi analizzare un elenco proprietario che restituisce.
L'elenco comune di *nix è come:
-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 un elenco come questo, questo codice funzionerà:
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)
Questo è un approccio piuttosto fragile.
MDTM
Un modo più affidabile, ma meno efficiente, è usare MDTM
comando per recuperare timestamp di singoli file/cartelle:
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)
Per una versione alternativa del codice, vedere la risposta di @Paulo.
Interruttore -t non standard
Alcuni server FTP supportano un -t
non standard proprietario cambia per NLST
(o LIST
) comando.
lines = ftp.nlst("-t")
latest_name = lines[-1]
Vedi Come ottenere i file nella cartella FTP ordinati per ora di modifica.
Download del file trovato
Non importa quale approccio usi, una volta che hai il latest_name
, lo scarichi come qualsiasi altro file:
with open(latest_name, 'wb') as f:
ftp.retrbinary('RETR '+ latest_name, f.write)
Vedi anche
- Ottieni l'ultimo nome della cartella FTP in Python
- Come ottenere l'ora di modifica del file FTP usando Python ftplib
Con NLST
, come mostrato nella risposta di Martin Prikryl, dovresti usare sorted
metodo:
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]