Änderungsdatum mit Python erkennen

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:Jeder kann auf einem FTP Server seine Adressdatei hoch laden. Die hat ein festes Format das jeder kennt.
Hi BoOnOdY!

Zwischenfrage: Wie heißen diese Dateien? Haben die eine besondere Dateiendung oder sind alle Dateien in einem bestimmten Ordner und in diesem Ordner darf keine andere Datei sein?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy,

die sind alle in einem Ordner und haben einen bestimmten Namen und eine bestimmte Endung, da sind noch Zip-Dateien und so drinne, aber die könnte ich rausnehmen, wär aber um so besser wen ndas Programm die nicht berücksichtigen würde :) :

wenn sie am 6 April 2007 um 14:26 Uhr hochgeladen wurde, dann heißt sie:

060420071426.adb


Aber es darf natürlich keine doppelt importiert werden, sondern immer nur die Neuste.

Gruß BoOnOdY
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Probiers mal so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os
import ftplib
import pickle

DIRSET_FILENAME = "dirset.bin"
FTP_HOST = "gelb.bcom.at"
FTP_USERNAME = "anonymous"
FTP_PASSWORD = ""
LOGFILENAME = "logfile.log"


def load_dirset():
    """
    Holt sich aus einer gepickelten Datei ein Set mit den Textzeilen des
    letzten Versuchs.
    """
    
    if os.path.isfile(DIRSET_FILENAME):
        f = file(DIRSET_FILENAME, "rb")
        dirset = pickle.load(f)
        f.close()
    else:
        dirset = set()
    
    return dirset


def save_dirset(dirset):
    """
    Schreibt das übergebene Set in eine Datei
    """
    
    f = file(DIRSET_FILENAME, "wb")
    pickle.dump(dirset, f, protocol = pickle.HIGHEST_PROTOCOL)
    f.close()


def main():
    
    ftp = ftplib.FTP(FTP_HOST, FTP_USERNAME, FTP_PASSWORD)
    
    old_dirset = load_dirset()
    new_dirset = set()
    
    dirlist = []
    ftp.dir(dirlist.append)
    
    for diritem in dirlist:
        if not diritem.startswith("d"):
            if diritem.lower().endswith(".adb"):
                new_dirset.add(diritem)
    
    # Hier sind die geänderten Datenzeilen
    diff_dirset = new_dirset.difference(old_dirset)
    
    print old_dirset
    print
    print new_dirset
    print
    print diff_dirset
    print
    
    # Die Dateinamen können hier natürlich auch in eine Logdatei geschrieben
    # werden
    f = file(LOGFILENAME, "a")
    for item in diff_dirset:
        f.write(item + "\n")
    f.close()
    
    # Hier kann mit den geänderten Datenzeilen etwas gemacht werden.
    # Z.B. kann jetzt eine Liste mit Dateinamen erstellt werden
    waste = "-rw-r--r--   1 ftp      ftp             0 Apr  6 12:39 "
    filenames = [ item[len(waste):] for item in diff_dirset ]
    
    print filenames
    
    # Dateien herunterladen
    for filename in filenames:
        f = file(filename, "wb")
        ftp.retrbinary("RETR %s" % filename, f.write)
        f.close()
    
    # Neues Set speichern
    save_dirset(new_dirset)
    
    ftp.close()

if __name__ == "__main__":
    main() 

# Nicht vergessen: Fehler abfangen
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Vielen Dank :)
Also ich les mich da im Moment rein udn probier einiges aus
ich hätte noch 2 winzige Fragen:



Code: Alles auswählen

 b = file("E:\AEP\UglyProg\log.log", "wb")
    for filename in filenames: 
        b.write(filename + "\n")
    b.close()
ich hab das noch eingefügt.
aber irgendwie funktioniert nach der Zeile
# Hier kann mit den geänderten Datenzeilen etwas gemacht werden.
# Z.B. kann jetzt eine Liste mit Dateinamen erstellt werden
waste = "-rw-r--r-- 1 ftp ftp 0 Apr 6 12:39 "
filenames = [ item[len(waste):] for item in diff_dirset ]
nichts mehr weiter?



Frage nummer 2.

Wie bau ich da eine Schleife drum herumm, die immer wenn die Minuten des Aktuellen timestamps 0, 5, 10 15, 20,25,30,35,40,45,50,55 sind das ganze ausführt??
Wenn ich das mit ner einfachen If-Abfrage mache brauch das dan nicht sehr viel CPU Leistung?

Gruß, vielen Dank und Frohe Ostern

BoOnOdY
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi BoOnOdY!
BoOnOdY hat geschrieben:

Code: Alles auswählen

 b = file("E:\AEP\UglyProg\log.log", "wb")
    for filename in filenames: 
        b.write(filename + "\n")
    b.close()
Einrückungsfehler?; Backslashes (\) nicht doppelt im String; Warum verwendest du keine Konstante um den Dateinamen im Programmkopf festzulegen?
BoOnOdY hat geschrieben:Wie bau ich da eine Schleife drum herumm, die immer wenn die Minuten des Aktuellen timestamps 0, 5, 10 15, 20,25,30,35,40,45,50,55 sind das ganze ausführt?
So was macht man nicht im Programm. Dafür ist unter Linux der "cron"-Daemon (=Dienst) zuständig und unter Windows richtet man für so etwas einen "Geplanten Task" (über die Systemsteuerung) ein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy,

sorry das ich mich so verdammt dumm anstele, aber wenn ich den Skript kopiere so wie er hier im Forum steht und noch eine kleine Änderung mache (ein change direktory im FTP) schreibt er mir nichts in meine log und nur so eine komische Zeichenfolge in die Dirset.bin
€c__builtin__
set
q ]q…qRq.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os
import ftplib
import pickle

DIRSET_FILENAME = "dirset.bin"
FTP_HOST = "1****"
FTP_USERNAME = "admin"
FTP_PASSWORD = "****"
LOGFILENAME = "logfile.log"
MONOLOG = "E:\\AEP\\Uglyprog\\log.log"



def load_dirset():
    """
    Holt sich aus einer gepickelten Datei ein Set mit den Textzeilen des
    letzten Versuchs.
    """
   
    if os.path.isfile(DIRSET_FILENAME):
        f = file(DIRSET_FILENAME, "rb")
        dirset = pickle.load(f)
        f.close()
    else:
        dirset = set()
   
    return dirset


def save_dirset(dirset):
    """
    Schreibt das übergebene Set in eine Datei
    """
   
    f = file(DIRSET_FILENAME, "wb")
    pickle.dump(dirset, f, protocol = pickle.HIGHEST_PROTOCOL)
    f.close()


def main():
   
    ftp = ftplib.FTP(FTP_HOST, FTP_USERNAME, FTP_PASSWORD)
   
    old_dirset = load_dirset()
    new_dirset = set()
   
    dirlist = []
    ftp.cwd("\\CDR\\checkout")
    ftp.dir(dirlist.append)
   
    for diritem in dirlist:
        if not diritem.startswith("d"):
            if diritem.lower().endswith(".adb"):
                new_dirset.add(diritem)
   
    # Hier sind die geänderten Datenzeilen
    diff_dirset = new_dirset.difference(old_dirset)
   
 

    print old_dirset
    print
    print new_dirset
    print
    print diff_dirset
    print 
   
    # Die Dateinamen können hier natürlich auch in eine Logdatei geschrieben
    # werden
    f = file(LOGFILENAME, "wb")
    for item in diff_dirset:
    	f.write(item + "\n")
    f.close()
   
    # Hier kann mit den geänderten Datenzeilen etwas gemacht werden.
    # Z.B. kann jetzt eine Liste mit Dateinamen erstellt werden
    waste = "-rw-r--r--   1 ftp      ftp             0 Apr  6 12:39 "
    filenames = [ item[len(waste):] for item in diff_dirset ]
   
    print filenames
   
    b = file(MONOLOG, "wb")
    for filename in filenames: 
    	b.write(filename + "\n")
    b.close()

    # Dateien herunterladen
    for filename in filenames:
    	f = file(filename, "wb")
    	ftp.retrbinary("RETR %s" % filename, f.write)
    	f.close()
   
    # Neues Set speichern
    save_dirset(new_dirset)
   
    ftp.close()

if __name__ == "__main__":
    main()
[/quote]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:

Code: Alles auswählen

ftp.cwd("\\CDR\\checkout")
Hi BoOnOdY!

Die komischen Zeichen in der Bin-Datei sind schon OK. Das ist ja auch keine menschenlesbare Datei.

Mach mal das daraus, dann dürfte es funktionieren:

Code: Alles auswählen

ftp.cwd("/CDR/checkout")
Du musst deinen Code natürlich zuerst einmal in einer Konsole oder in einer IDE laufen lassen, damit du die Fehlermeldungen zurück bekommst. Sonst ist das ja ein Blindflug.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hey =)
vielen Dank es geht alles super.
Sau geil, auf euch kann man sich immer verlassen.
=)=)=)=)

Gruß BoOnOdY
Antworten