Warum verwenden Sie nicht die Option „nächstes Verzeichnis“?
ftp.dir('-t',data.append)
Mit dieser Option ist die Dateiliste zeitlich von der neuesten zur ältesten geordnet. Rufen Sie dann einfach die erste Datei in der Liste ab, um sie herunterzuladen.
Für diejenigen, die nach einer vollständigen Lösung suchen, um die neueste Datei in einem Ordner zu finden:
MLSD
Wenn Ihr FTP-Server MLSD
unterstützt Befehl, ist eine Lösung einfach:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
LISTE
Wenn Sie sich auf einen veralteten LIST
verlassen müssen Befehl, müssen Sie eine proprietäre Auflistung parsen, die er zurückgibt.
Übliche *nix-Auflistung sieht so aus:
-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
Bei einer Auflistung wie dieser reicht dieser Code aus:
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)
Dies ist ein ziemlich fragiler Ansatz.
MDTM
Zuverlässiger, aber weniger effizient, ist die Verwendung von MDTM
Befehl zum Abrufen von Zeitstempeln einzelner Dateien/Ordner:
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)
Eine alternative Version des Codes finden Sie in der Antwort von @Paulo.
Nicht standardmäßiger Schalter -t
Einige FTP-Server unterstützen einen proprietären, nicht standardmäßigen -t
Schalter für NLST
(oder LIST
) Befehl.
lines = ftp.nlst("-t")
latest_name = lines[-1]
Siehe So erhalten Sie Dateien im FTP-Ordner nach Änderungszeit sortiert.
Gefundene Datei wird heruntergeladen
Egal welchen Ansatz Sie verwenden, sobald Sie die latest_name
haben , laden Sie sie wie jede andere Datei herunter:
with open(latest_name, 'wb') as f:
ftp.retrbinary('RETR '+ latest_name, f.write)
Siehe auch
- Neuesten FTP-Ordnernamen in Python abrufen
- So erhalten Sie die Änderungszeit der FTP-Datei mit Python ftplib
Mit NLST
, wie in Martin Prikryls Antwort gezeigt, sollten Sie sorted
verwenden Methode:
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]