os.walk() mit Ausnahmen

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
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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('.')]
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

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 :) .
nilshero
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 12:22
Wohnort: Worms
Kontaktdaten:

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
"Es gibt keine Lösung, weil es kein Problem gibt"
(Marcel Duchamp)
BlackJack

@nilshero: Keine Lösung für das Problem. Es sollten keine Verzeichnisse aufgelistet werden, sondern Dateien. Ausser solchen, die in "versteckten" Verzeichnissen liegen.
nilshero
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 12:22
Wohnort: Worms
Kontaktdaten:

@ whiteJack Du hast nicht verstanden oder willst nicht verstehen.
"Es gibt keine Lösung, weil es kein Problem gibt"
(Marcel Duchamp)
BlackJack

@nilshero: Na dann erklär's mal…
nilshero
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 12:22
Wohnort: Worms
Kontaktdaten:

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 (-:
"Es gibt keine Lösung, weil es kein Problem gibt"
(Marcel Duchamp)
Antworten