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]