GNU/Linux >> Znalost Linux >  >> Linux

Python FTP získá nejnovější soubor podle data

Proč nepoužijete možnost next dir?

ftp.dir('-t',data.append)

S touto volbou je výpis souborů časově řazen od nejnovějšího po nejstarší. Poté stačí načíst první soubor v seznamu a stáhnout jej.


Pro ty, kteří hledají úplné řešení pro nalezení nejnovějšího souboru ve složce:

MLSD

Pokud váš FTP server podporuje MLSD příkaz, řešení je snadné:

entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)

SEZNAM

Pokud se potřebujete spolehnout na zastaralý LIST musíte analyzovat proprietární výpis, který vrací.

Běžný zápis *nix je jako:

-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

S výpisem, jako je tento, tento kód udělá:

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)

Toto je poměrně křehký přístup.

MDTM

Spolehlivější, ale méně efektivní je použití MDTM příkaz k načtení časových razítek jednotlivých souborů/složek:

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)

Alternativní verzi kódu naleznete v odpovědi od @Paulo.

Nestandardní přepínač -t

Některé FTP servery podporují proprietární nestandardní -t přepněte na NLST (nebo LIST ) příkaz.

lines = ftp.nlst("-t")

latest_name = lines[-1]

Viz Jak získat soubory ve složce FTP seřazené podle času úpravy.

Stahování nalezeného souboru

Bez ohledu na to, jaký přístup použijete, jakmile budete mít latest_name , stáhnete jej jako jakýkoli jiný soubor:

with open(latest_name, 'wb') as f:
    ftp.retrbinary('RETR '+ latest_name, f.write)

Viz také

  • Získejte nejnovější název složky FTP v Pythonu
  • Jak získat čas úpravy souboru FTP pomocí Python ftplib

S NLST , jak je uvedeno v odpovědi Martina Přikryla, měli byste použít sorted metoda:

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. Nejúčinnější způsob, jak vyprázdnit obsah souboru?

  2. Získejte čas na vytváření souborů s Pythonem na linuxu

  3. jak najít vlastníka souboru nebo adresáře v pythonu

  1. Jak získat velikost tar.gz v (MB) souboru v pythonu

  2. Jak získat PYTHONPATH v shellu?

  3. Jak získám absolutní adresář souboru v bash?

  1. Jak získat pouze počet řádků souboru

  2. Příkaz pro získání stavu synchronizace souboru Dropbox

  3. Získejte datum poslední změny souboru v Linuxu