Inhalt von Verzeichnissen einer bestimmten Ebene.

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
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Tag,

in der Bash und anderen Shells gibt es in der Regel "find" mit den Optionen "-maxdepth" und "-mindepth". Beispielsweise findet:

Code: Alles auswählen

find $pfad -maxdepth 5 -mindepth 3 -type f
Alle Dateien eines Types in einer Verzeichnisstruktur (Hirarchie) die min. in der dritten Ebene, jedoch max. in der sechsten sind.

Wie mache ich soetwas in Python?
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Dreckig, aber geht:

Code: Alles auswählen

reduce(lambda x,y: x+y, [map(lambda x: os.path.join(dirpath,x),filenames) for dirpath, dirnames, filenames in os.walk('/home/marc') if 3 <= len(dirpath.split(os.sep))-1 <= 5])
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Etwas angepasste Variante:

Code: Alles auswählen

sum([[os.path.join(dirpath, filename) for filename in filenames] for dirpath, dirnames, filenames in os.walk('\download') if 3 <= dirpath.count(os.sep) <= 5], [])
MfG
HWK
lunar

@defnull: Das tut meinem Verständnis nach aber etwas anderes. Es zählt die absolute Anzahl der Ebenen ausgehend vom Wurzelverzeichnis, während "-mindepth" und "-maxdepth" von "find" sich auf die relative Anzahl der Ebenen ausgehend vom Suchverzeichnis bezieht.

Dein Code würde "/tmp/foo/bar" für das Verzeichnis "/tmp" akzeptieren, während "find" bei "-mindepth 3" für "/tmp" das Verzeichnis "/tmp/foo/bar" nicht berücksichtigt, sondern erst ab "/tmp/foo/bar/spam" anfängt.

Zudem sollte man vorher "normpath()" anwenden, damit die Anzahl der Verzeichnistrenner wirklich etwas über die Tiefe der Verzeichnisebene aussagt.
problembär

Wußte lange Zeit nicht, wie "find" funktioniert. Hatte hier irgendwann gelernt: Mit Rekursion.
Hatte dann mal eine Grundversion (ohne os.walk() oder os.path.walk()) nachgebaut, allerdings bislang ohne "-mindepth" und "-maxdepth":

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os

def myfind(wd):

    a = os.listdir(wd)

    dirs = []

    for i in a:
        i = wd + "/" + i
        if os.path.isdir(i):
            dirs.append(i)

    for adir in dirs:

        print adir
        for afile in os.listdir(adir):
            print adir + "/" + afile

        print
        print

        # Recursion needed:
        myfind(adir)

myfind(os.getcwd())
Gruß
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Vielen Dank fuer die Antworten, ich sehe sie mir alle mal an. Das Lambda scheint echt nett zu sein, ich habe schon drei Funktionen damit in meiner Bibliothek. Das muss ich mir mal anschauen.


Mein Ansatz fuer ein "Pyfind" war bisher "os.walk", dann splitten des ganzen Dateipfades, zaehlen mit "len()" und eine "if" abfrage. Das alles plus eines Sockels wegen dem Startverzeichnis.
Antworten