GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Python FTP ruft die neueste Datei nach Datum ab

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]

Linux
  1. Effizienteste Methode, um den Inhalt einer Datei zu leeren?

  2. Holen Sie sich die neueste Datei in einem Verzeichnis unter Linux

  3. Wie finde ich den Besitzer einer Datei oder eines Verzeichnisses in Python?

  4. So erhalten Sie eine formatierte Datumszeit in Python

  5. So erhalten Sie die Größe von tar.gz in (MB) Datei in Python

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

So holen Sie das Beste aus Qmmp 1.0 heraus

Wie man nur die Anzahl der Zeilen einer Datei erhält

Ein Befehl zum Abrufen des Synchronisierungsstatus einer Dropbox-Datei

Holen Sie sich das letzte Änderungsdatum der Datei in Linux

Wie erhalte ich die physische Größe einer Datei unter Linux?