Walk Funktion

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
iv0ry
User
Beiträge: 2
Registriert: Mittwoch 17. Februar 2010, 19:12

Hallo,
ich habe eine Walk Funktion in meinem Code, um einen Verzeichnisbaum nach einem bestimmen Wort zu suchen,sprich er öffnet alle Dateien und prüft sie.
Jedoch habe ich diese Walk als rekursiv und das erweist sich bei komplexen Verzeichnissen als sehr lange...
Wie kann ich diese iterativ machen? Er will nämlich immer 3 Argumente haben bei der walk Funktion...
Aber der Code an sich läuft so, nur es könnte bei großen Mengen lange dauern :/
Mein Code:

Code: Alles auswählen

    def __funcSearch(self,key,verzeichnis,data):
        # data ist ausfuehrlich: data=listdir(verzeichnis), sprich eine Liste der Unterverzeichnisse
        '''Suche nach Dateien, die das Schluesselwort enthalten'''
            chdir(verzeichnis) #in das angegebene Verzeichnis wechseln
            for datei in data:
                if path.isfile(datei):
                    
                        f=file(datei,'r')
                        list=f.readlines()
                        f.close()
                        for l in list:
                            self.__line+=1
                            if key in l:
                                    self.__errList+=[(self.__line,datei)]
                        self.__line=0

    def search(self):
        walk(self.__path,self.__funcSearch,self.__key) #rekursiver Aufruf von funcSearch in jedem neuen Verzeichnis
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Es gibt os.walk().
Den Mittelteil würde ich eher so schreiben:

Code: Alles auswählen

for name in file_names:
    if path.isfile(name):
        with open(name, 'r') as infile:
            for line in infile:
                if key in line:
                    self.err_list.append(line)
Es ist ungünstig, Bestandteile der Sprache (list) zu überschreiben.
Listen sollten auch als Liste genutzt werden.
Bezeichner sollten nie mit __ anfangen und beschreiben, was sie bezeichnen.
Die Dauer sollte nichts damit zu tun haben, ob eine Funktion rekursiv oder iterativ aufgerufen wird.
iv0ry
User
Beiträge: 2
Registriert: Mittwoch 17. Februar 2010, 19:12

mh okay die Fassung ist kürzer und evtl besser ;)
Aber os.walk nutze ich ja, bei mir steht nur "walk" weil os importiert wurde...

Aber die Komplexität von einer rekursiven und dergleichen in iterativ kann sich doch deutlich unterscheiden?
Ja gut Bezeichner privat zu machen, ist eine Gewohnheitssache aus Java :p
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

iv0ry hat geschrieben: Aber die Komplexität von einer rekursiven und dergleichen in iterativ kann sich doch deutlich unterscheiden?
Wie definierst Du Komplexität? In der Informatik versteht man i.A. darunter das Lauzeitverhalten eines Algos (http://de.wikipedia.org/wiki/Laufzeit_%28Informatik%29). Diese ist ja unabhängig von der Implementierung eines Algorithmus.
Also meinst Du vermutlich etwas anderes?
Ja gut Bezeichner privat zu machen, ist eine Gewohnheitssache aus Java :p
Wobei "__" nichts aber auch gar nichts mit "privat" zu tun hat.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:
iv0ry hat geschrieben:Ja gut Bezeichner privat zu machen, ist eine Gewohnheitssache aus Java :p
Wobei "__" nichts aber auch gar nichts mit "privat" zu tun hat.
Mehr dazu: http://tutorial.pocoo.org/classes.html# ... -variablen
Antworten