Durchsuchen von Verzeichnisbäumen

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

Ich hab oft die Anforderung, in recht wirren Verzeichnisbäumen Dateien mit bestimmten Endungen zu finden und diese dann zu verarbeiten. Dazu habe ich mir mal die folgende kleine rekursive Funktion gebastelt:

Code: Alles auswählen

def getFileList(p='.',e='',d='/',fl=[]):

    """p=path, e=extension, d=path-delimiter, fl=recursive filelist"""

    for f in os.listdir(p):
        f=p+d+f
        if os.path.isdir(f):
            fl=getFileList(f,e,d,fl)
        elif os.path.isfile(f) and f.endswith(e):
            fl.append(f)
    return fl
Sie durchläuft den angegebnen Pfad und gibt die gefundenen Dateien dann als Liste zurück. Ich geh mal davon aus, das man das noch etwas schöner machen kann, und frage mal nach was man denn da noch verbessern könnte...;)

Grüssle Uwe

PS: os.walk() ist mir bekannt, allerdings war mir das irgendwie zu umständlich.
---------------------------------
have a lot of fun!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

os.walk() ist aber durchaus brauchbar.

Ansonsten ist wohl fnmatch interessant für dich.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also das finde ich nicht umstaendlich:

Code: Alles auswählen

def search(path, ending):
    for root, dirs, filenames in os.walk(path):
        for filename in filenames:
            if filename.endswith(ending):
                yield os.path.join(root, filename)
Und wenn du wirklich nur nach der Extension suchst, reicht auch das:

Code: Alles auswählen

def search2(path, extension):
    """ 
       extension with leading point, for example: ".png"
    """
    for root, dirs, filenames in os.walk(path):
        for filename in filenames:
            if os.path.splitext(filename)[-1] == extension:
                yield os.path.join(root, filename)
Sind beides Generator-Funktionen, wenn du eine Liste haben willst einfach list nehmen:

Code: Alles auswählen

result = list(search2('.', '.py'))
Gruss

*edit* Bitte verwende os.path.join anstatt direkt den Delimiter mitzugeben. Verwende auch aussagekraeftige Name fuer die Variablen.
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

Jo, danke erstmal, werd mir os.walk nochmal genauer und fnmatch überhaupt ansehen und verbuche meinen Ansatz mal unter 'ich lerne Rekursion'. :)

Als Erweiterung kam mir noch die Idee, die Dateinamen selbst noch mittels Regular Expression zu filtern.

Was ist denn an meinen Variablennamen auszusetzen? Sie entsprechen doch eindeutig den naming-conventions vom Commodore 4032? Irgendwie bin ich da in der Vergangenheit hängen geblieben, ich weiß... ;)

Grüssle Uwe
---------------------------------
have a lot of fun!
Antworten