Seite 2 von 2
Verfasst: Freitag 6. April 2007, 13:05
von gerold
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

Verfasst: Freitag 6. April 2007, 13:27
von BoOnOdY
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
Verfasst: Freitag 6. April 2007, 14:01
von gerold
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

Verfasst: Freitag 6. April 2007, 18:03
von BoOnOdY
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
Verfasst: Freitag 6. April 2007, 18:53
von gerold
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

Verfasst: Freitag 6. April 2007, 19:37
von BoOnOdY
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]
Verfasst: Freitag 6. April 2007, 19:53
von gerold
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:
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

Verfasst: Freitag 6. April 2007, 20:08
von BoOnOdY
Hey =)
vielen Dank es geht alles super.
Sau geil, auf euch kann man sich immer verlassen.
=)=)=)=)
Gruß BoOnOdY