Durchsuchen von Verzeichnisbäumen

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

Durchsuchen von Verzeichnisbäumen

Beitragvon Käptn Haddock » Dienstag 16. Dezember 2008, 11:59

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 16. Dezember 2008, 12:05

os.walk() ist aber durchaus brauchbar.

Ansonsten ist wohl fnmatch interessant für dich.

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

Beitragvon rayo » Dienstag 16. Dezember 2008, 12:16

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: 167
Registriert: Freitag 24. März 2006, 14:27

Beitragvon Käptn Haddock » Dienstag 16. Dezember 2008, 13:44

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!

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]