Seite 1 von 1

Durchsuchen von Verzeichnisbäumen

Verfasst: Dienstag 16. Dezember 2008, 11:59
von Käptn Haddock
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.

Verfasst: Dienstag 16. Dezember 2008, 12:05
von jens
os.walk() ist aber durchaus brauchbar.

Ansonsten ist wohl fnmatch interessant für dich.

Verfasst: Dienstag 16. Dezember 2008, 12:16
von rayo
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.

Verfasst: Dienstag 16. Dezember 2008, 13:44
von Käptn Haddock
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