GNU/Linux >> Linux Esercitazione >  >> Linux

Python FTP ottiene il file più recente per data

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]

Linux
  1. Il metodo più efficiente per svuotare il contenuto di un file?

  2. Ottieni il file più recente in una directory su Linux

  3. Ottieni mtime di un file specifico usando Bash?

  4. Come ottenere PYTHONPATH nella shell?

  5. Come ottengo la directory assoluta di un file in bash?

Come ottenere la data e l'ora correnti in Python

Come ottenere il massimo da Qmmp 1.0

Come ottenere la dimensione di tar.gz nel file (MB) in python

Come ottenere la data/ora di creazione del file in Bash/Debian?

Ottieni la data dell'ultima modifica del file in Linux

Utilizzo di tail per seguire un file senza visualizzare le righe più recenti