GNU/Linux >> Tutoriels Linux >  >> Linux

Python FTP obtient le fichier le plus récent par date

Pourquoi n'utilisez-vous pas l'option répertoire suivant ?

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

Avec cette option, la liste des fichiers est triée dans le temps du plus récent au plus ancien. Il suffit ensuite de récupérer le premier fichier de la liste pour le télécharger.


Pour ceux qui recherchent une solution complète pour trouver le dernier fichier dans un dossier :

MLSD

Si votre serveur FTP prend en charge MLSD commande, une solution est simple :

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

LISTE

Si vous devez vous fier à un LIST obsolète commande, vous devez analyser une liste propriétaire qu'elle renvoie.

La liste commune *nix ressemble à :

-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

Avec une liste comme celle-ci, ce code fera l'affaire :

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)

C'est une approche plutôt fragile.

MDTM

Un moyen plus fiable, mais moins efficace, est d'utiliser MDTM commande pour récupérer les horodatages de fichiers/dossiers individuels :

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)

Pour une version alternative du code, voir la réponse de @Paulo.

Commutateur -t non standard

Certains serveurs FTP prennent en charge un -t propriétaire non standard changer pour NLST (ou LIST ) commande.

lines = ftp.nlst("-t")

latest_name = lines[-1]

Voir Comment obtenir des fichiers dans un dossier FTP triés par heure de modification.

Téléchargement du fichier trouvé

Quelle que soit l'approche que vous utilisez, une fois que vous avez le latest_name , vous le téléchargez comme n'importe quel autre fichier :

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

Voir aussi

  • Obtenir le dernier nom de dossier FTP en Python
  • Comment obtenir l'heure de modification du fichier FTP à l'aide de Python ftplib

Avec NLST , comme indiqué dans la réponse de Martin Prikryl, vous devez utiliser sorted méthode :

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. Linux – Comment obtenir la date de création d'un fichier sur un volume logique Ntfs ?

  2. Obtenez le temps de création de fichier avec Python sur Linux

  3. Obtenir mtime d'un fichier spécifique en utilisant Bash ?

  4. Comment obtenir la date/heure de création du fichier dans Bash/Debian ?

  5. Une commande pour obtenir l'état de synchronisation d'un fichier Dropbox

Comment obtenir la date et l'heure actuelles en Python

Comment tirer le meilleur parti de Qmmp 1.0

Comment obtenir le répertoire absolu d'un fichier dans bash ?

Comment obtenir uniquement le nombre de lignes d'un fichier

Obtenir la date de la dernière modification du fichier sous Linux

Comment obtenir la taille physique d'un fichier sous Linux ?