Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Ich muss von einem anderen Rechner via FTP die zuletzt dort abgespeicherte Datei mit der Endung .dat auf meinen Rechner holen.
Es sind dort mehrere hundert .dat Dateien. Ich brauch aber nur die letzte.
from ftplib import FTP
ftp = FTP("blabla") # connect to host, default port
ftp.login("pasu","dada") # user anonymous, passwd anonymous@
ftp.cwd("/dateien")
#ftp.retrlines('LIST') # list directory contents
# Define the local directory name to put data in
ddir="C:\\datadir"
# If directory doesn't exist make it
if not os.path.isdir(ddir):
os.mkdir(ddir)
# Change the local directory to where you want to put the data
os.chdir(ddir)
Und das soll auch für Dateien gehen, die man via FTP von einem Server holt? Er will sich ja vermutlich nicht erst alle runterladen, sondern vorab gucken, welches die neueste ist.
# If directory doesn't exist make it
if not os.path.isdir(ddir):
os.mkdir(ddir)
# Change the local directory to where you want to put the data
os.chdir(ddir)
#date=os.stat(ddir)
time=os.path.getmtime(ddir)
print time
Ich bin auf das Modul ftpparse gestoßen. Allerdings ist das schon älter und wirft bei mir einen Fehler, wenn ich's installieren will. Ansonsten müsste man die Ausgabe halt selber parsen. Problematisch dabei ist, dass LIST offenbar kein einheitliches Format ausgibt.
@Manne_Manta: Kannst du mal so ein List machen und sagen wie die Ausgabe ist und ob sie einheitlich ist?
Hier eine simple Klasse, die ftplib.FTP() um Datumssortierung erweitert. Einsetzbar wie das Original, nur eben mit der Zusatzfunktion. Noch nicht sehr schön, aber das kannst du ja ausbessern, wenn du willst.
import ftplib
from operator import itemgetter
class Sorter(ftplib.FTP):
def __init__(self, host='', user='', passwd='', acct=''):
"""
Behaves like ftplib.FTP()
"""
ftplib.FTP.__init__(self, host, user, passwd, acct)
def datesort_files(self):
"""
Return a date-sorted file list from the current
ftp directory with the latest file on top
"""
files = []
for filename in self.nlst():
try:
mdtm = self.sendcmd('MDTM %s' % filename)
date = mdtm.split()[1]
files.append((filename, date))
except ftplib.error_perm:
pass
return sorted(files, key=itemgetter(1), reverse=True)
Das war nicht gemeint: wenn du deine __init__-Methode weglässt wird statt dessen eh die von ftplib.FTP aufgerufen. Die Signatur unterscheidet sich nur unwesentlich von deiner:
Ich muss aber die optionalen Login-Argumente doch irgendwie an ftplib.FTP() übergeben. Wenn ich dafür keine __init__()-Methode mache, kann die Klasse auch schlecht was annehmen. Oder gibt es da einen anderen, besseren Weg für?
Achsooooooooooooo (ausprobieren soll ja zwischendurch hilfreich sein). Nee, so herum hatte ich tatsächlich nicht gedacht. Okay, dann kann sie natürlich weg.