Seite 1 von 1
Inhalt von Verzeichnissen einer bestimmten Ebene.
Verfasst: Freitag 6. November 2009, 10:55
von Gabelmensch
Tag,
in der Bash und anderen Shells gibt es in der Regel "find" mit den Optionen "-maxdepth" und "-mindepth". Beispielsweise findet:
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?
Verfasst: Freitag 6. November 2009, 11:32
von Defnull
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])
Verfasst: Freitag 6. November 2009, 17:18
von HWK
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
Verfasst: Freitag 6. November 2009, 17:39
von 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.
Verfasst: Freitag 6. November 2009, 18:29
von 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ß
Verfasst: Samstag 7. November 2009, 09:47
von Gabelmensch
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.