Seite 2 von 4
Verfasst: Donnerstag 7. Mai 2009, 10:16
von Manne_Manta
Jetzt werd ich mit meinen nicht vorhandenen Kenntnissen etwas überfordert.
Ich hab jetzt deinen Code als "py" Datei in den "lib" Ordner kopiert.
dann hab ich jetzt folgenden Code:
Code: Alles auswählen
import os
import FTPFileSorter
from operator import itemgetter
from ftplib import FTP
ftp = FTP("dadada") # connect to host, default port
ftp.login("pipipi","dididi") # user anonymous, passwd anonymous@
ftp.cwd("/dat3")
#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)
Ist das mit dem Aufruf der "FTPFileSorter" so richtig?
Was muss ich jetzt noch in den Code einfügen um die letzte ".dat" Datei zu erhalten?
Danke schon mal für die Bemühungen.
Verfasst: Donnerstag 7. Mai 2009, 13:58
von cofi
Ich glaube du solltest mal das Tutorial lesen. Ein Name ist nich auf magische Weise importierbar, indem man die Datei einfach in den Bibliotheken-Ordner knallt.
Zeile 2:
`snafu_ftp` musst du natürlich mit dem Dateinamen ersetzen.
Zeile 5:
Verfasst: Donnerstag 7. Mai 2009, 14:22
von EyDu
Code: Alles auswählen
>>> import os
>>> os.path.exists("test.py")
True
>>> os.path.isfile("test.py")
True
>>> os.path.isdir("test.py")
False
Denk mal drüber nach
Außerdem solltest du noch die ein oder andere Exception abfangen.
Verfasst: Freitag 8. Mai 2009, 14:35
von snafu
@Manne_Manta:
Mein Skript ersetzt die entsprechende Klasse aus der `ftplib`.
Nehmen wir an, dein Programm ist unter `ftpsorter.py` gespeichert. Dann geht es so:
Code: Alles auswählen
from ftpsorter import FTPFileSorter as Sorter
sorter = Sorter(adresse_von_ftpserver, dein_username, dein_pw) # natürlich nur wenn du nen username + passwort da hast, ansonsten nur die adresse
sorter.cwd('/dat3')
# das listet dir die dat-files geordnet nach datum auf:
sorter.datesort_files(pattern='*.dat', prettylines=True)
# wenn du mit dem dateinamen weiterarbeiten willst:
latest_dat, date = sorter.datesort_files(pattern='*.dat')[0]
Den Part mit `fnmatch` kann man sich übrigens sparen, da `nlst()` Globbing unterstützt.
Verfasst: Dienstag 12. Mai 2009, 06:54
von Manne_Manta
Leider bekomme ich das Speichern der Datei nicht hin.
Code: Alles auswählen
import os
from ftpsorter import FTPFileSorter as Sorter
sorter = Sorter("bububu", "dadada", "trtrtr")
sorter.cwd('/dat3')
# das listet dir die dat-files geordnet nach datum auf:
sorter.datesort_files(pattern='*.dat', prettylines=True)
# wenn du mit dem dateinamen weiterarbeiten willst:
latest_dat, date = sorter.datesort_files(pattern='*.dat')[0]
# 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)
# get the remote file to the local directory
sorter.retrbinary("RETR %s" % latest_dat, open(latest_dat,"wb").write)
was ist an der "retrbinary" Zeile falsch.
Es gibt keine Fehlermeldung aus, aber es passiert auch nichts.
Habs hinbekommen.
Code: Alles auswählen
# Change the local directory to where you want to put the data
os.chdir(ddir)
Dann klappts auch.
Danke für die Hilfe nochmal.
Verfasst: Mittwoch 13. Januar 2010, 07:19
von Manne_Manta
Ich muss mich jetzt nach längerer Zeit wieder mit meinem Tool rumschlagen. Leider hab ich mit Py2Exe eine Exe draus gemacht und den Quellcode verschlampt.
Ich hab folgendes als "ftpfilesorter.py" in den Lib Ordner kopiert:
Code: Alles auswählen
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)
und das ist das auszuführende File:
Code: Alles auswählen
import os
from string import join as join
from shutil import rmtree as rmtree
from ftpsorter import *
from easygui import integerbox as integerbox
#Read data from config File
configfile = "config.csv"
exportpath = []
fpath = []
pdevice = []
plogin = []
ppassw = []
for line in open(configfile ,'rU'):
line = line.rstrip()
if line:
data = line.split(";")
exportpath.append(data)
fspath.append(data)
pdevice.append(data)
plogin.append(data)
ppassw.append(data)
exportpath = exportpath[0][0]
fpath = fpath[1][0]
pdevice = pdevice[2][0]
plogin = plogin[2][1]
ppassw = ppassw[2][2]
x=integerbox(msg=boxtext, title='fFTP Imp V0.1', default=1, argLowerBound=0, argUpperBound=99, image=None, root=None)
sorter = Sorter(pdevice ,plogin , ppassw)
sorter.cwd('/dat3')
#Delete path
rmtree(exportpath,1)
# das listet dir die dat-files geordnet nach datum auf:
sorter.datesort_files(pattern='*.dat', prettylines=True)
for x in range (0,x):
# wenn du mit dem dateinamen weiterarbeiten willst:
latest_dat, date = sorter.datesort_files(pattern='*.dat')[x]
latest_bin, date = sorter.datesort_files(pattern='*.bin')[x]
# If directory doesn't exist make it
if not os.path.isdir(exportpath):
os.mkdir(exportpath)
# Change the local directory to where you want to put the data
os.chdir(exportpath)
#write file to selected directory
sorter.retrbinary("RETR %s" % latest_dat, open(latest_dat,"wb").write)
sorter.retrbinary("RETR %s" % latest_bin, open(latest_bin,"wb").write)
file = open("datei" + str(x)+".txt",( "w") )
file.write(latest_dat)
x=x+1
file.close()
#cv.wait(10)
os.startfile(fpath)
Die Fehlermeldung lautet nun: got an unexpected keyword argument 'pattern'
Kann mir da jemand helfen?
Danke im Voraus.
Verfasst: Mittwoch 13. Januar 2010, 07:24
von Manne_Manta
Sorry die Fehlemeldung hier komplett:
datesort_files() got an unexpected keyword argument 'pattern'
Verfasst: Mittwoch 13. Januar 2010, 08:32
von snafu
Ja, lies die Fehlermeldung. Deine `datesort_files` Methode nimmt kein Schlüsselwort-Argument `pattern` an und übrigens auch kein `prettylines`.
Zudem verweise ich auf:
cofi hat geschrieben:Ich glaube du solltest mal das Tutorial lesen.
Verfasst: Mittwoch 13. Januar 2010, 10:04
von snafu
Code: Alles auswählen
import ftplib
import time
class TimeFTP(ftplib.FTP):
def last_modified(self, *args):
for filename in self.nlst(*args):
retcode, timestamp = self.sendcmd('mdtm ' + filename).split(' ', 1)
timestruct = time.strptime(timestamp, '%Y%m%d%H%M%S')
yield filename, timestruct
Code: Alles auswählen
In [1]: from timeftp import TimeFTP
In [2]: ftp = TimeFTP('ftp.gimp.org', 'anonymous')
In [3]: ftp.cwd('pub/pango/1.21')
Out[3]: '250 Directory successfully changed.'
In [4]: max(ftp.last_modified('*.md5'))
Out[4]:
('pango-1.21.5.tar.gz.md5',
time.struct_time(tm_year=2008, tm_mon=8, tm_mday=26, tm_hour=21, tm_min=59, tm_sec=10, tm_wday=1, tm_yday=239, tm_isdst=-1))
Verfasst: Mittwoch 13. Januar 2010, 12:20
von Manne_Manta
Danke.
Was ich damit allerdings nicht machen kann, ist, eine beliebige Anzahl der zuletzt erzeugten Files vom Server zu holen.
sowie hier:
Code: Alles auswählen
for x in range (0,x):
# wenn du mit dem dateinamen weiterarbeiten willst:
latest_dat, date = sorter.datesort_files(pattern='*.dat')[x]
latest_bin, date = sorter.datesort_files(pattern='*.bin')[x]
Wo ich jetzt auch noch auf dem Schlauch stehe, ist wie ich das File geschrieben bekomme.
Code: Alles auswählen
letztes=max(ftp.last_modified('*.dat'))
ftp.retrbinary("RETR %s" "test %s", open(letztes, 'wb').write)
funktioniert natürlich nicht.
Verfasst: Mittwoch 13. Januar 2010, 22:54
von snafu
Hast du inzwischen zumindest ein bißchen im Tutorial gelesen? Es macht echt keinen Spass, wenn man das Gefühl hat, dass sich die Leute alles vorkauen lassen wollen...
Code: Alles auswählen
In [10]: ftp = TimeFTP('ftp.gimp.org', 'anonymous')
In [11]: ftp.cwd('pub/pango/1.21')
Out[11]: '250 Directory successfully changed.'
In [12]: latest3 = sorted(ftp.last_modified('*.md5'))[-3:]
In [13]: latest3
Out[13]:
[('pango-1.21.4.tar.gz.md5',
time.struct_time(tm_year=2008, tm_mon=8, tm_mday=11, tm_hour=23, tm_min=58, tm_sec=36, tm_wday=0, tm_yday=224, tm_isdst=-1)),
('pango-1.21.5.tar.bz2.md5',
time.struct_time(tm_year=2008, tm_mon=8, tm_mday=26, tm_hour=21, tm_min=59, tm_sec=10, tm_wday=1, tm_yday=239, tm_isdst=-1)),
('pango-1.21.5.tar.gz.md5',
time.struct_time(tm_year=2008, tm_mon=8, tm_mday=26, tm_hour=21, tm_min=59, tm_sec=10, tm_wday=1, tm_yday=239, tm_isdst=-1))]
In [14]: for name, time in latest3: print name
....:
pango-1.21.4.tar.gz.md5
pango-1.21.5.tar.bz2.md5
pango-1.21.5.tar.gz.md5
Verfasst: Donnerstag 14. Januar 2010, 13:00
von Manne_Manta
Sorry wenn ich dir lästig bin. Ich hab natürlich angefangen das Tutorial zu lesen. Ich habe das Tool ja eigentlich auch schon lauffähig, nur leider keinen Quellcode mehr (sogar mit Tkinter GUI).
Durch "sorted" werden die Daten ja in eine Liste geschrieben. Wie können die Datensätze aus der Liste gespeichert werden?
Code: Alles auswählen
ftp.retrbinary("RETR %s" % latestx_dat, open(latestx_dat,"wb").write)
liefert ja nur den letzten Datensatz aus der Liste. Wie komme ich an die anderen Datensätze?
Hier der Gesammte Code:
Code: Alles auswählen
#Import Bibliotheken
from timeftp import TimeFTP
ftp = TimeFTP('kkkk, 'pppp,'tttt') # Aufbau FTP Verbindung
ftp.cwd('/dat3') #In Quellverzeichnis wechseln
x=-2
latest_dat, last1 = max(ftp.last_modified('*.dat'))
latestx = sorted(ftp.last_modified('*.dat'))[x:]
for latestx_dat, time in latestx: latestx_dat
for name, time in latest3: print name
ftp.retrbinary("RETR %s" % latestx_dat, open(latestx_dat,"wb").write)
Verfasst: Donnerstag 14. Januar 2010, 15:05
von snafu
http://paste.pocoo.org/show/165367/
Code: Alles auswählen
In [1]: import timeftp
In [2]: ftp_addr = "ftp://ftp.gimp.org/pub/pango/1.21/"
In [3]: timeftp.get_last_modified(ftp_addr, '*.md5', 3, 'testdir', 'anonymous')
Die Funktion könnte natürlich auch `save_*` oder `download_*` heißen. Dies möge der geneigte Leser sich bei Bedarf verbessern.

Verfasst: Mittwoch 20. Januar 2010, 07:09
von Manne_Manta
Ich hab mein ganzes Tool jetzt wieder fertiggeschrieben.
Leider ist mir jetzt aufgefallen das get_last_modified nicht das aktuelleste File vom Server holt, sondern das ganze nach dem Filenamen auflöst.
Ist das bei Dir auch so?
Ich hab das Script 1:1 von Dir übernommen und nur meine Parameter eingesetzt.
Die timeftp hab ich 1:1 übernommen.
Verfasst: Mittwoch 20. Januar 2010, 09:57
von snafu
Bei mir gehts. Zeig doch mal die Ausgabe von `TimeFTP.last_modified()` im Vergleich zu `TimeFTP.dir()`. Oder woran erkennst du, dass es nicht funktioniert?
Verfasst: Mittwoch 20. Januar 2010, 10:39
von Manne_Manta
TimeFTP.last_modified liefert einen Timestamp:0x026828F0 was nicht passen kann (13.04.1971, 09:50:56 Uhr).
TimeFTP.dir() liefert ja die ganze Directory. Die Directory ist aber komplett durcheinander. Wenn ich das richtig verstehe, mussten nach Datum sortierte Werte ausgespuckt werden, oder?
Ich hab hier Werte vom Dezember, danach welche aus dem September und dann kommt mal was aus dem Januar.
Das tatsächliche Datum des zuletzt geschriebenen Files, laut normalem FTP Programm ist der 20.01.2010 um 10:21.
Verfasst: Donnerstag 21. Januar 2010, 07:54
von Manne_Manta
Hat keiner nen Tip?
Code: Alles auswählen
import timeftp
ftp_addr = "ftp://testserver/tst3"
timeftp.get_last_modified(ftp_addr, '*.dat', 2, 'C:\user', 'login','pass')
Code: Alles auswählen
import ftplib
import os.path
import time
import urlparse
class TimeFTP(ftplib.FTP):
def last_modified(self, pattern):
for filename in self.nlst(pattern):
retcode, timestamp = self.sendcmd('MDTM ' + filename).split()
timestruct = time.strptime(timestamp, '%Y%m%d%H%M%S')
yield filename, timestruct
def get_last_modified(ftp_addr, pattern='*', no=1, dest='.', user='', pw=''):
parsed = urlparse.urlparse(ftp_addr)
ftp = TimeFTP(parsed.netloc, user, pw)
if parsed.path:
ftp.cwd(parsed.path)
for filename, timestruct in sorted(ftp.last_modified(pattern))[-no:]:
with open(os.path.join(dest, filename), 'wb') as outfile:
ftp.retrbinary('RETR ' + filename, outfile.write)
liefert bei mir nicht die zuletzt auf den Server geschriebene Datei, sondern die mit dem "höchsten" Filenamen
Verfasst: Donnerstag 21. Januar 2010, 08:51
von snafu
Ich glaube wir haben es auch so verstanden... Das Datum kommt halt in einem Format zurück, bei dem nicht klar ist, wie es geparst werden soll. Du siehst ja am Gimp-Beispiel selbst, dass normalerweise etwas anderes erwartet wird. Ich hab mich danach gerichtet:
MDTM
Syntax: MDTM remote-filename
Returns the last-modified time of the given file on the remote host in the format "YYYYMMDDhhmmss": YYYY is the four-digit year, MM is the month from 01 to 12, DD is the day of the month from 01 to 31, hh is the hour from 00 to 23, mm is the minute from 00 to 59, and ss is the second from 00 to 59.
Wenn du mal die Seite nennen würdest und falls sie öffentlich zugänglich ist, dann könnte man mal ein bißchen rumprobieren. Andernfalls: Was gibt denn ein `ftp.sendcmd('syst')` zurück?
Hier übrigens nochmal eine Verbesserung, da `sorted()` entgegen meiner Vermutung doch nicht mit `struct_time` zurecht kommt. Und bitte tu mir und dem Forum den Gefallen und kopier den Quelltext
nicht nochmal hier rein. Die Teilnehmer hier sind nämlich zum größten Teil fähig, einen Link anzuklicken.
EDIT: `get_last_modified()` heißt jetzt `download_datesorted()`.
Verfasst: Donnerstag 21. Januar 2010, 09:26
von Manne_Manta
Die Seite ist leider nicht öffentlich. Habs mal ausprobiert.
Code: Alles auswählen
>>> ftp.cwd('/dat3')
'250 OK. Current directory is /dat3'
>>> ftp.sendcmd('PWD')
'257 "/dat3" is your current location'
>>> ftp.sendcmd('SYST')
'215 UNIX Type: L8'
>>>
Super. Danke!!!
Deine Verbesserung war der Knackpunkt. Jetzt gehts.
Super. Danke!!!

Verfasst: Donnerstag 21. Januar 2010, 09:43
von snafu
Und jetzt, nur um Missverständnissen vorzubeugen, bitte ein `ftp.mdtm(dateiname)` (neuen Quelltext benutzen) für eine beliebige Datei aus dem FTP-Verzeichnis, wo du bist und Ausgabe posten.