Seite 1 von 1
os.walk() mit Ausnahmen
Verfasst: Dienstag 30. Juni 2009, 10:33
von da.dom
Hallo Zusammen,
ich durchlaufe eine Verzeichnisstruktur und filtere Dateien aus die bestimmte Dateiendungen haben:
Code: Alles auswählen
for root,dir,files in os.walk("C:\some_path"):
for file in files:
if any([file.upper().endswith(EXT.upper()) for EXT in FILE_PATTERN]):
fileList.append(root.replace("\\","/")+"/"+file)
Jetzt suche ich eine elegante Möglichkeit neben der Datei-Filterung (ist das so in Ordnung, oder gibt es dafür was eleganteres) auch auf die Ordnerstruktur zu filtern. Um etwas konkreter zu werden: es sollen nur Ordner durchlaufen werden die nicht mit einem "." - beginnen (das sind Konfigurationsordner die aussen vor gelassen werden sollen)
Meine erste Idee wäre den Pfad der Datei einfach nach einem Ordner mit "." zu durchsuchen, aber wie ich euch kenne habt Ihr da sicher eine etwas elegantere Variante parat.
Danke schon mal
Dom
Verfasst: Dienstag 30. Juni 2009, 10:52
von EyDu
Kurze Tips vorweg:
- "dir" und "file" sind schlechte Namen, da du damit built-in-Namen verdeckst.
- "EXT" sollte besser "ext" heißen, da es sich um keine Konstante handelt
- Wenn du einen Pfad angibst (und ihn nicht os.path.join) zusammensetzt, dann benutze raw-Strings: r"C:\some_path". Sonst bekommst du u.U. Probleme mit Escape-Sequenzen.
Zur Filterung: da könntest du das os-Modul zur Zerlegung benutzen. Eine bessere Methode als für jede Ausgabe zu prüfen, fällt mir gerade auch nicht ein. Vielleicht kann man noch ein wenig mit den "glob"-Modul drehen.
Verfasst: Dienstag 30. Juni 2009, 11:27
von da.dom
EyDu hat geschrieben:Kurze Tips vorweg:
- "dir" und "file" sind schlechte Namen, da du damit built-in-Namen verdeckst.
- Wenn du einen Pfad angibst (und ihn nicht os.path.join) zusammensetzt, dann benutze raw-Strings: r"C:\some_path". Sonst bekommst du u.U. Probleme mit Escape-Sequenzen.
Wird geändert, hört sich nachvollziehbar an
EyDu hat geschrieben:
- "EXT" sollte besser "ext" heißen, da es sich um keine Konstante handelt
Dachte das Konstrukt einer Konstanten gibt es in dem Sinne (wie ich es aus Java mit 'final' kenne) nicht, aber ich lasse mich gerne eines besseren Belehren. Ich würde an der Stelle in Java eine "finale" Variable verwendent, also eine die nicht mehr verändert werden kann (EXT stellt in meinem Programm ja so was wie ein Programm Parameter dar, der nur einmal beim Start des Programm festgelegt werden soll), das wollte ich mit der Großschreibung dann einfach symbolisieren
EyDu hat geschrieben:
da könntest du das os-Modul zur Zerlegung benutzen.
Ja an so was hatte ich dann ja auch gedacht, eleganter wäre natürlich die Dateie die sich in einem "Punkt-Ordner" befinden erst gar nicht auf zu nehmen / die Ordner erst gar nicht zu durchlaufen, darum wäre meiner Ansicht nach der schönere Ansatzpunkt bereits beim durchlauf der Ordner?!
Grüße
D
Verfasst: Dienstag 30. Juni 2009, 11:37
von cofi
da.dom hat geschrieben:Dachte das Konstrukt einer Konstanten gibt es in dem Sinne (wie ich es aus Java mit 'final' kenne) nicht, aber ich lasse mich gerne eines besseren Belehren. Ich würde an der Stelle in Java eine "finale" Variable verwendent, also eine die nicht mehr verändert werden kann (EXT stellt in meinem Programm ja so was wie ein Programm Parameter dar, der nur einmal beim Start des Programm festgelegt werden soll), das wollte ich mit der Großschreibung dann einfach symbolisieren

Es gibt keine _echten_ Konstanten, das ist richtig. Darum greift man auf Konventionen zurück, eben die Großschreibung. EXT ist eben keine Konstante, weil es in dem Snippet die Patterns durchläuft, darum ist die Benennung falsch.
Verfasst: Dienstag 30. Juni 2009, 11:43
von BlackJack
@da.dom: Du kannst in Python keine Zuweisungen an eine Konstante verhindern, aber durch den Namen eben kenntlich machen, dass es eine Konstante sein soll. Sachen die beim Programmstart auf einen beliebigen Wert gesetzt werden können, sind aber nicht Konstant.
Java's ``final`` ist auch nicht Konstant in dem Sinne, denn *einmal* kann man so einer Variablen ja *dynamisch* etwas zuweisen.
Wenn Du "versteckte" Verzeichnisse gar nicht erst betreten möchtest, kannst Du sie aus der Liste mit den Verzeichnissen entfernen:
Code: Alles auswählen
directories[:] = [d for d in directories if not d.startswith('.')]
Verfasst: Dienstag 30. Juni 2009, 12:03
von da.dom
BlackJack hat geschrieben:
Code: Alles auswählen
directories[:] = [d for d in directories if not d.startswith('.')]
Genau an so was hatte ich gedacht, nur hatte ich versucht das ganze ohne zwischenritt im Kopf der Schleife zu machen, also so was:
Code: Alles auswählen
for root,dir,files in [r,d,f for r,d,f in os.walk("PATH") if not d.startswith('.')]:
Was syntaktisch aber scheinbar nicht möglich ist
BlackJack hat geschrieben:
Darum greift man auf Konventionen zurück, eben die Großschreibung. EXT ist eben keine Konstante, weil es in dem Snippet die Patterns durchläuft, darum ist die Benennung falsch.
ah, hatte schon was anderes geschrieben, aber jetzt sehe ich deinen Punkt ein

völlig richtig, EXT sollte klein geschrieben werden, Bei "FILE_PATTERN" habe ich dann aber alles richtig gemacht, keine Ahung warum ich auf die Idee gekommen bin EXT auch groß zu schreiben

.
Verfasst: Montag 6. Juli 2009, 11:28
von nilshero
Dafür ist yield wie geschaffen.
Bsp.:
Code: Alles auswählen
import os
def iteriereNichtSvnVerzeichnisse(wurzelpfad):
for r,vs,ds in os.walk(wurzelpfad):
for v in vs:
if not v.startswith('.'):
yield v
for verzeichnis in iteriereNichtSvnVerzeichnisse('C:\lorem\ipsem\dolor'):
print(verzeichnis)
Gruß, Nils
Verfasst: Montag 6. Juli 2009, 11:45
von BlackJack
@nilshero: Keine Lösung für das Problem. Es sollten keine Verzeichnisse aufgelistet werden, sondern Dateien. Ausser solchen, die in "versteckten" Verzeichnissen liegen.
Verfasst: Dienstag 7. Juli 2009, 12:51
von nilshero
@ whiteJack Du hast nicht verstanden oder willst nicht verstehen.
Verfasst: Dienstag 7. Juli 2009, 17:19
von BlackJack
@nilshero: Na dann erklär's mal…
Verfasst: Donnerstag 9. Juli 2009, 18:18
von nilshero
hallo wieder (Bin nur selten im I-Net),
da.dom hat geschrieben:Jetzt suche ich eine elegante Möglichkeit neben der Datei-Filterung (ist das so in Ordnung, oder gibt es dafür was eleganteres) auch auf die Ordnerstruktur zu filtern.
da.dom möchte also mehrere Aufgabenbereiche während einem Iterationsschritt durchführen. Dafür ist wie gezeigt, die Verwendung von benutzerdefinierten Iteratoren praktisch.
Ich hatte den Eindruck, das ihm die Verwendung von diesen im Zusammenhang mit yield (Nicht-Lispern nicht unbedingt bekannt) nicht ganz klar sei, da nicht erwähnt, passt aber hier sehr gut. also hab ich mal ein exemplarisches Beispiel gebracht, leider von ihm kein Feedback, aber so ist's.
Bin jetzt aber zu faul, ihm den Code zu schreiben. Aber wenn er mit z.B. den Code schreibt, wie man unter Win und py3.+ die Eigenschaften eines Links (*.lnk) ausliest (daran sitze ich gerade) dann schreibe ich ihm gerne den Code für seine Iteratoren (-: