FTP Download nach Datum

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.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 5. Mai 2009, 15:46

Ich hatte es mir über help(ftplib.FTP) ausgeben lassen und mich an der Ausgabe nicht weiter gestört.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 5. Mai 2009, 15:59

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?
shcol (Repo | Doc | PyPi)
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 5. Mai 2009, 16:01

Wenn du kein `__init__` definierst, erbst du die der Elternklasse. Und du machst nichts anderes als die aufzurufen ;)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 5. Mai 2009, 16:06

Achsooooooooooooo (ausprobieren soll ja zwischendurch hilfreich sein). Nee, so herum hatte ich tatsächlich nicht gedacht. Okay, dann kann sie natürlich weg.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 5. Mai 2009, 17:38

shcol (Repo | Doc | PyPi)
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Beitragvon Manne_Manta » Donnerstag 7. Mai 2009, 10:16

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=]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)[/code]

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Donnerstag 7. Mai 2009, 13:58

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:

Code: Alles auswählen

from snafu_ftp import FTPFileSorter

`snafu_ftp` musst du natürlich mit dem Dateinamen ersetzen.
Zeile 5:

Code: Alles auswählen

ftp = FTPFileSorter("dadada")
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 7. Mai 2009, 14:22

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Freitag 8. Mai 2009, 14:35

@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.
shcol (Repo | Doc | PyPi)
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Beitragvon Manne_Manta » Dienstag 12. Mai 2009, 06:54

Leider bekomme ich das Speichern der Datei nicht hin.

[code=]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) [/code]

was ist an der "retrbinary" Zeile falsch.
Es gibt keine Fehlermeldung aus, aber es passiert auch nichts.

Habs hinbekommen.


[code=]# Change the local directory to where you want to put the data
os.chdir(ddir)[/code]
Dann klappts auch.

Danke für die Hilfe nochmal.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Beitragvon Manne_Manta » Mittwoch 13. Januar 2010, 07:19

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.
Zuletzt geändert von Manne_Manta am Mittwoch 13. Januar 2010, 07:52, insgesamt 3-mal geändert.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Beitragvon Manne_Manta » Mittwoch 13. Januar 2010, 07:24

Sorry die Fehlemeldung hier komplett:

datesort_files() got an unexpected keyword argument 'pattern'
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Mittwoch 13. Januar 2010, 08:32

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.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Mittwoch 13. Januar 2010, 10:04

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))
shcol (Repo | Doc | PyPi)
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Beitragvon Manne_Manta » Mittwoch 13. Januar 2010, 12:20

Danke. :D

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]