Funktion wiederholt aufrufen

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.
Antworten
leonards
User
Beiträge: 18
Registriert: Samstag 9. Juni 2012, 10:59

Hallo,
ich habe ein Programm geschrieben, das alle Downloads, die gemacht werden, löscht.
Dafür habe ich folgenden Code geschrieben:

Code: Alles auswählen

def automatisch_start(self):
  self.status.config(text='Automatische Downloadsicherung angeschaltet')
  self.momentan = os.listdir('C:/Users/'+os.getenv('Username')+'/Downloads')
  f = file('C:/leonard-program/keylog/daten/standarddaten/downloads.txt','r')
  self.standard = pickle.load(f)
  f.close()
  for datei in self.momentan:
    if datei not in self.standard:
      try: os.remove('C:/Users/'+os.getenv('Username')+'/Downloads/'+datei)
      except: os.removedirs('C:/Users/'+os.getenv('Username')+'/Downloads/'+datei)
Dabei wird die Funktion natürlich nur einmal aufgerufen..
Das erfüllt aber nicht den Zweck. Daher möchte ich am Ende der Funktion die Funktion neu aufrufen.
Kann man aber nicht...
Wie könnte ich es ohne while True schaffen, das Sich die Funktion immer wieder neu aufruft?
Gruß Leonard :)
BlackJack

@leonards: Ich rate mal dass das Teil einer `Tkinter`-GUI ist. Dann geht das mit der `after()`-Methode, die es auf jedem Widget gibt.

Zum Quelltext: Man sollte Wiederholungen von Code und von Daten vermeiden. Überleg Dir mal was Du alles ändern musst, wenn sich der Pfad mal ändern sollte und wie schnell es da passieren kann, dass man eine der Stellen aus versehen nicht anpasst. Ausserdem sollte man Pfade nicht mit ``+`` sondern mit `os.path.join()` zusammensetzen.

Warum werden `momentan` und `standard` an das Objekt gebunden? Für mich sehen die nach ganz normalen lokalen Variablen aus.

Edit: Pickle-Dateien sind Binärdateien. Die muss man im Binärmodus zum lesen und schreiben öffnen, sonst funktionieren die unter Umständen nicht richtig. Insbesondere unter Windows ist das problematisch.
BlackJack

@leonards: Und noch mehr: Die Einrückung hält sich nicht an den Style Guide for Python Code. Das wären vier Leerzeichen pro Ebene. Bei Blöcken mit nur einer Zeile wird dort auch empfohlen trotzdem einen eingerückten Block zu schreiben statt alles in eine Zeile zu quetschen.

Dateien sollte man mit der ``with``-Anweisung öffnen und mit `open()` statt mit `file()`. Letzteres ist als Datentyp zum ableiten von eigenen Klassen gedacht.

Das was Du `datei` nennst ist keine sondern es werden Datei*namen* an diesen Namen gebunden.

Der Code dürfte auch Probleme mit Verzeichnissen bekommen die nicht leer sind.

Ungetestet:

Code: Alles auswählen

    def automatisch_start(self):
        download_path = os.path.join(
            'C:/Users', os.getenv('Username'), 'Downloads'
        )
        self.status['text'] = 'Automatische Downloadsicherung angeschaltet'

        with open(
            'C:/leonard-program/keylog/daten/standarddaten/downloads.txt', 'rb'
        ) as standard_filenames_file:
            standard_filenames = set(pickle.load(standard_filenames_file))
        
        for filename in set(os.listdir(download_path)) - standard_filenames:
            full_name = os.path.join(download_path, filename)
            try:
                if os.path.isdir(full_name):
                    shutil.rmtree(full_name)
                else:
                    os.remove(full_name)
            except EnvironmentError, error:
                # 
                # TODO: Do something with the error here.  At least log it.
                # 
                pass
Antworten