Seite 1 von 1

Walk Funktion

Verfasst: Mittwoch 17. Februar 2010, 19:17
von iv0ry
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

Verfasst: Mittwoch 17. Februar 2010, 20:52
von mkesper
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.

Verfasst: Mittwoch 17. Februar 2010, 21:41
von iv0ry
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

Verfasst: Mittwoch 17. Februar 2010, 21:47
von Hyperion
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.

Verfasst: Mittwoch 17. Februar 2010, 21:50
von cofi
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