Ä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.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Guten Morgen,

ich such mir schon den ganzen Morgen nen Wolf find aber keine Lösung auf mein Problem, wahrscheinlich weil ich einfach nicht die richtigen Stichwörter hab. Vielleicht kann mir ja jemand von euch helfen:

Ich möchte Python alle 2 Minuten einen Ordner durchsuchen lassen und jedesmal wenn eine Datei neuer ist als 2 Minuten, dann soll er sie kopieren und einen Mechanismus anstoßen.
Also so zu sagen eine Art Sicherung.
Allerdings brauche ich auch den Namen der Datei für eine Art "log" datei.

Gibt es in Python einen Befehl der immer die neuste Datei findet? Weil jede Datei hat ja einen Zeitstempel.

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

BoOnOdY hat geschrieben:jede Datei hat ja einen Zeitstempel.
Hi BoOnOdY!

``os.path.getmtime()``

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

BoOnOdY hat geschrieben:Ich möchte Python alle 2 Minuten einen Ordner durchsuchen lassen und jedesmal wenn eine Datei neuer ist als 2 Minuten, dann soll er sie kopieren und einen Mechanismus anstoßen.
Unter neueren Linux Kerneln gibt's ja die Möglichkeit, dafür eine Kernel-Schnittstelle zu benutzen, die das Polling, welche Dateien sich geändert haben, überflüssig macht (inotify).
Das dafür nötige Modul heißt gamin. Das wäre auf dieser Plattform wohl die eleganteste Lösung.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Ne ich hab Windows.

Also nur mal so was ich machen will :

Einen Ordner überwachen und jedes mal, wenn eine neue Datei in ihn geschrieben wird, will ich mir deren Namen in ne kleine Log schreiben.

Das kleine Problem ist, dass der Ordner über FTP erreicht werden muss.

Soll so ne Art Sicherung für meinen Webspace werden. Jedesmal wenn ich etwas neues drauflade, soll ein anderer meiner Rechner sich die Datei automatisch kopieren und in eine Log deren Namen schreiben.

Ich weiß nicht wie ich mich da drann machen soll. Also ich finde keinen Ansatz wie ich an das Problem drann gehen solll. So von wegen Stichworten die ich googeln kann um Befehle zu finden und so.

Hat einer ne Idee?

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

BoOnOdY hat geschrieben:Das kleine Problem ist, dass der Ordner über FTP erreicht werden muss.
Hi BoOnOdY!

Nimm ``wget``, verwende den ``--mirror``-Parameter

- http://gnuwin32.sourceforge.net/packages/wget.htm
- http://de.wikipedia.org/wiki/Wget
- http://wget.dotsrc.org/index.shtml

und vergiss das Logging. Und nein, ich weiß immer noch nicht genau was du willst.

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

Ne das ist nicht das wahre, da der archiv PC ein server im Keller ist.


Also ich versuchs ma ganz einfach zu erklären:

Auslösehandlung:
Auf einem FTP Server kommt eine Datei dazu

Folgehandlung
Datei wird auf Server kopiert
Dateiname wird in eine Log eingetragen

Man könnte es als art "FTP-RAID" beschreiben

und ich brauch halt was, das immer weiß, wann ne Datei neu ist und wann nicht. Das ist mein Problem.
Wie erkennt ein Python programm, ob eine Datei schon beim letzten mal auf dem Server war.
Ich würde die dann gerne immer gucken lassen, einen Slepp von 5-10 Minuten einlegen und dann wieder gucken. Aber ich brauch ja irgendwelche Vergleichsparameter damit das Programm weiß was neu ist und was nicht?


Gruß BoOnOdY
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

BoOnOdY hat geschrieben: Auslösehandlung:
Auf einem FTP Server kommt eine Datei dazu

Folgehandlung
Datei wird auf Server kopiert
Dateiname wird in eine Log eingetragen
Also ich würde dir liebend gerne helfen aber ich verstehe is immer noch nicht... :?

:?:
Du hast also einmal einen FTP-Server und dann einen weiteren Server?!
Und auf diesen werden dann die Dateien kopiert?! Wodurch und wann?
Sorry leuchtet mir noch nicht ganz ein...
Und von welchem Rechner aus wird jetzt das script ausgeführt?

Also wenn du von Rechner A (Rechner auf dem das Skript laufen soll) auf einen Rechner B (FTP-Server) zugreifen willst,
kannst du dir ja mal das angucken:
http://www.python.org/doc/2.4.1/lib/module-ftplib.html
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Also ich habe einen PCa auf dem FTP drauf ist
und einen PCb auf dem das Skript laufen soll
und noch einen PCc der neue Daten auf den FTP von PCa schiebt.

ich will immer wenn PCc eine Datei auf PCa´s FTP hochläd automatisch PCb eine Kopie davon machen lassen und den Dateinamen in ne Log schreiben lassen.

So besitzt PCb einen Ordner indem alle Dateien die auf PCa in FTP reingestellt wurden sind und auch bleiben. Wenn also auf PCa eine Datei gelöscht wird ist die Sicherung noch auf PCb.

Ich kann es nicht selbst auslösen und von Hand machen, weil nicht nur ich auf den FTP zugreife und außerdem das alle 5 Minuten passiert. Also wär das sau viel Arbeit, und das nur einmal am Tag zu machen ist mir zu unsicher.


Jetzt bin ich zwar verwirrt aber ich hoffe es ist dir klarer ?

Gruß BoOnOdY
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Jo ok, das hab ich dann soweit verstanden.

Naja, auf jeden Fall würde ich im Prinzip so vorgehen.

- Alle 10 Minuten mit FTP-Server connecten.
- Liste (passende Struktur) von Dateinamen und deren aktuelles Datum beziehen.
- mit Liste der vorhandenen Dateien auf dem Clientrechner vergleichen (auch nach Datum )
- Dateien die auf dem Server neu(bzw neuer) sind runterladen und das in der log festhalten
- connection schliessen

Also ich würde mir halt vorher mal genauer die ftplib angucken und schauen
wie man da am besten an die einzelnen Daten zu den Dateien kommt.
(Zeitstempel, Name usw)
Habe leider auf die schnelle keine schönen examples zur Hand und kann
das leider auch gerade nicht bei mir selber durchspielen.
Unter Umständen muss man da dann einige Strings Parsen die zurück gegeben werden.

Vielleicht gibts auch ne bessere Alternative als die ftplib?!
Da bin ich überfragt...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Zap hat geschrieben:Vielleicht gibts auch ne bessere Alternative als die ftplib?!
Ja, gibt es. Nennt sich Unison und funktioniert sogar in zwei Wege und über verschiedene Transportprotokolle.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Das geht auch mit FTP? weil ich komm an den Server nur via FTP ran.

und ich brauche die Log datei und ein paar weitere Mechanismen anzustoßen. Das heißt die Daten sollen noch sortiert, bzw. bearbeitet werden.

Die Datei kommt auf den FTP server von einem fremden PC
ich lad sie mir runter und protokolliere ihren Namen
ich stoße verschiede Mechanismusprogramme an, die sich den Namen aus der log holen und die Datei bearbeiten.

Gruß BoOnOdY
BlackJack

Wenn die Anforderung mit der Logdatei nicht wäre, hätte ich ja vorgeschlagen alle halbe Stunde oder so ein `rsync` anzuwerfen.

Noch ein Punkt, den man bedenken muss: Wenn so ein Backup-Skript anläuft und eine neue Datei entdeckt, kann es durchaus sein, dass diese Datei gerade hochgeladen wird und noch gar nicht komplett ist.

Vielleicht kann man auch auf die Log-Datei vom FTP-Server zugreifen und sich dort die neuen und komplett hochgeladenen Dateien heraussuchen!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BoOnOdY hat geschrieben:Das geht auch mit FTP? weil ich komm an den Server nur via FTP ran.
Nein, so wie ich das sehe geht das nicht.

Entweder du ziehst dir einfach in der Nacht jeweils ein normales Backup oder du benutzt einen besseren Server.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Dann hab ich aber immernoch das Problem mit dem Automatismus den ich für jede neue Datei anwerfen muss, damit die gefiltert wird und so. Naja is lass es einfach mal hier ein bisschen im Forum stehen, vieleicht kommt ja jemandem noch ein Gedanke.

Aber Danke bis jetzt schon ma, dass ihr alle versucht mir zu helfen :)

gruß
BoOnOdY
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy ich weiß nicht ob ich ein neues Topic aufmachen soll, deswegen
SORRY 4 DOPPELPOST


Aber ich hab mir mal folgendes überlegt, wie man das Problem lösen könnte (eigentlich nur das aufgewertet was ihr hier gepostet habt) und schreib jetzt mal eine Art Struktogramm ( ich weiß, dass es kein richtiges ist, aber besser bekomm ichs auf die Schnelle nicht hin)


ANFANG
log.log unbenennen in log.alt
ftp.dir in log.log schreiben
log.log mit log.alt vergleichen
jede Datei/Zeile die sich in log.log von log.alt unterscheidet herunterladen.
einen kurzen Sleep einlegen
go to ANFANG



so weit so gut, nur ich brauch jetzt so zu sagen das "Handwerkszeug" dafür, also ein gutes Tutorial das beschreibt, wie man 2 Dateien Zeile für Zeile miteinander vergleicht und dann in eine neue Datei schreibt.

ich werd mich auch mal weiter von Tutorial zu Tutorial googeln, war aber bis jetzt nicht erfolgreich.


Gruß BoOnOdY
BlackJack

Zeile für Zeile vergleichen wird wahrscheinlich nicht soviel bringen, weil die Dateien nicht gleich lang sind wenn Dateien hinzukommen.

Die Situation lässt sich am einfachsten mit `set()`\s lösen, Dich interessieren ja Mengenoperationen auf Zeilen.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Das set ist schon ma sehr cool :)


also ich hab jetzt mal ein bisschen hier im Forum geforscht und hätt noch ein paar Fragen.

also in dem Beitrag will jemand ja nur die Datei mit dem aktuellen Datum haben.
http://www.python-forum.de/topic-7347.h ... hlight=ftp
und hier hat ja auch jemand ein ähnliches Problem
http://www.python-forum.de/topic-8231.h ... hlight=ftp

Wenn man davon ausgehen kann, dass die Datei die ich rein schreibe einen Zeitstempel als Namen hat, dann könnte ich ja einfach alle möglichen Zeitstempel ausprobieren. Also jede Minute versuchen ein File mit dem aktuellen Zeitstempel herunter zu laden. Aber belastet ist das denn nicht ganz schön Aufwenig von der Leistung her?

Da wäre es doch einfacher die Prozedur in eine IF abfrage zu stecken, die erst einmal nachsieht ob ein entsprechendes File auf dem Server ist, und wenn ja dann soll es sich das File holen.

Also ein einfaches Programm das jede Minute guckt, ob ein File mit dem entsprechenen Timestamp auf dem Server ist. Aber da ich so gut wie keine Erfahrungen in Python habe frage ich mich wie das geht.

Von der Logik her.

Anfang
Aktuelle Uhrzeit in Stunden und Minuten mit einer Variablen vergleichen
if Uhrzeit ist ungleich Variable,
aktuelle Uhrzeit in Variable schreiben
versuche Datei vom FTP server zu laden die den entsprechenden Namen hat
go to Anfang


Weil das mit der Zeit in dem Dateinamen könnte ich einfach hinbekommen, aber ist es nicht sehr aufwendig jede Minute zu gucken?, aber wie will man sonst den Dateinamen der wirklich jede Minute sein könnte herausfinden?

Ich glaube das Programm würde die CPU ziemlich auslasten, und ich trau mich erlich gesagt das nicht zu versuchen weil ich Angst hab, dass ich es nicht mehr aus bekomme wiel ich in ner Endlosschleife lande die die CPU so auslastet das man nix mehr machen kann, udn ich komm auf den PC auf dem ich das probieren will nur mit Remote Desktop ran. Da wäre das ziemlich kompliziert.

Ist denn das Time Objekt wirklich immer variabel?, also das Programm schaut sich es nicht nur an wenn es gerade gestartet wird, sondern so lange, bis es die Bedinung erfüllt?


Ich weiß es sind viele Fragen und wohlmöglich auch manchmal unklar gestellt, aber ich kann sie im Moment leider nicht verständlicher Formulieren, bin aber für Rückfragen immer zur Stelle.

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

Hallo BoOnOdY!

Ich habe mir jetzt nicht die Mühe gemacht, die Beiträge komplett durchzulesen.

Ich gebe dir jetzt einen kleinen Gedankenschupser. Und wenn du damit nichts anfangen kannst, weil ich die Randbedingungen nicht kenne, dann ignoriere den Stoß. ;-)

Das Kommandozeilenprogramm "wget" kann Dateien von einem FTP-Server herunterladen. Wenn man "wget" mit dem Parameter "--mirror" benutzt, dann wird auf dem Computer auf dem "wget" ausgeführt wird, ein kompletter **Spiegel** des angeforderten FTP-Ordners angelegt. Wird "wget" mit dem Parameter "--mirror" danach noch einmal ausgeführt, dann werden nur mehr die **geänderten** Dateien vom FTP-Server geholt.

Und jetzt kommt noch so ein Denkanstoß: Wenn man "wget" zusätzlich mit dem Parameter "-o logdatei.log" ausführt, dann wird jede Aktivität von "wget" in die Datei "logdatei.log" geschrieben. Z.B. so: ``wget --mirror ftp://gelb.bcom.at -o logdatei.log``

Rate mal was ebenfalls in dieser Logdatei steht. --> Die Dateien die neu heruntergeladen wurden. Neben diesen steht nämlich der String "saved".
Z.B. so (schon mal nach "saved" gefiltert):

Code: Alles auswählen

12:14:36 (212.18 KB/s) - `gelb.bcom.at/.listing' saved [188]
12:14:36 (282.51 KB/s) - `gelb.bcom.at/index.html' saved [623]
12:14:37 (477.68 KB/s) - `gelb.bcom.at/sw3/.listing' saved [67]
12:14:37 (409.21 KB/s) - `gelb.bcom.at/test/.listing' saved [67]
12:14:37 (275.20 KB/s) - `gelb.bcom.at/test/index.html' saved [623]
Wenn du jetzt alle Zeilen herausfilterst, in denen "saved [" steht und die Zeilen mit dem Text ".listing" ignorierst, dann hast du eine Liste aller Dateien, die sich auf dem FTP-Server geändert haben.

Es geht sogar noch einfacher: Wenn du zusätzlich den Parameter "--no-verbose" verwendest. Sieh selber nach, wie die Logdatei damit aussieht. :-)

Jetzt musst du nur noch die neuen/geänderten Dateien in ein komprimiertes TAR-Archiv oder sonst wo in ein Archiv kopieren und dem Archiv als Dateinamen das aktuelle Datum und die Uhrzeit geben.

Jetzt hast du immer einen aktuellen Spiegel des FTP-Servers und die Änderungen sind gesammelt in TAR-Dateien

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Und so könnte man dieses Logfile parsen:

Code: Alles auswählen

>>> s = """
... 12:44:44 URL: ftp://gelb.bcom.at/ [188] -> "gelb.bcom.at/.listing" [1]
... 12:44:44 URL: ftp://gelb.bcom.at/index.html [614] -> "gelb.bcom.at/index.html" [1]
... 12:44:44 URL: ftp://gelb.bcom.at/sw3/ [67] -> "gelb.bcom.at/sw3/.listing" [1]
... 12:44:45 URL: ftp://gelb.bcom.at/test/ [67] -> "gelb.bcom.at/test/.listing" [1]
... 12:44:45 URL: ftp://gelb.bcom.at/test/index.html [614] -> "gelb.bcom.at/test/index.html" [1]
... 
... FINISHED --12:44:45--
... Downloaded: 1,550 bytes in 5 files
... """
>>> for line in s.splitlines():
...     if '"' in line:
...         parsed_str = line.split('"')[1]
...         if not parsed_str.endswith(".listing"):
...             print parsed_str
...     
gelb.bcom.at/index.html
gelb.bcom.at/test/index.html
>>> 
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 :)

Ich werde mal ein bisschen was zu wget lesen und ausprobieren.

Aber hier trozdem der Background einfach und kurz erklärt:

Ich habe ein kleines Adressbuch aller meiner Freunde im Keller auf einem SQL Server.

Jeder kann auf einem FTP Server seine Adressdatei hoch laden. Die hat ein festes Format das jeder kennt.
Hans läd seine Datei heute um 12:11 Uhr auf den FTP Server

Dann soll das Programm eingreifen, das erkennen und den Namen der Datei in ein Log schreiben. Danach soll es die Datei in einen bestimmten Ordner auf dem Server auf dem der Skript läuft schreiben.Dann soll es ein Programm ( das ich schon fertig habe) anstoßen, das diese Adressdatei filtert, sortiert und in die Datenbank schreibt. Dieses Filter-programm holt sich den Namen der zu filternden Datei aus der log.

Was passiert aber wenn um 12:12 dazu noch Christian seine Datei hochläd und ich nur alle 5 Minuten nach neuen Files gucke?
Antworten