2012-11-19 18 views
25

Ich muss alle Dateien mit dem enthaltenen Verzeichnispfad in einem Ordner auflisten. Ich habe versucht, os.walk zu verwenden, was offensichtlich die perfekte Lösung wäre.os.walk ohne versteckte Ordner

Es listet jedoch auch versteckte Ordner und Dateien auf. Ich möchte, dass meine Anwendung keine versteckten Ordner oder Dateien auflistet. Gibt es ein Flag, mit dem Sie keine versteckten Dateien erstellen können?

Plattformübergreifend ist mir nicht wirklich wichtig, es ist in Ordnung, wenn es für Linux funktioniert nur (. * Muster)

+1

Welche Plattform sind Sie? "versteckt" hat auf verschiedenen Betriebssystemen unterschiedliche Bedeutungen. –

+0

Ich bin auf Linux, ich werde das auf die Antwort hinzufügen. – lolopop

Antwort

56

Nein, es gibt keine Möglichkeit zu os.walk(), die die überspringen werden. Sie werden sich tun müssen, so (was leicht genug ist):

for root, dirs, files in os.walk(path): 
    files = [f for f in files if not f[0] == '.'] 
    dirs[:] = [d for d in dirs if not d[0] == '.'] 
    # use files and dirs 

Notiere die dirs[:] = Scheibe Zuordnung; Wir ersetzen die Elemente in dirs (und nicht die Liste, die von dirs bezeichnet), so dass os.walk() gelöschte Verzeichnisse nicht verarbeiten wird.

Dies funktioniert nur, wenn Sie das topdown Stichwort Argument True halten, von den documentation of os.walk():

Wenn topdownTrue ist, der Anrufer die dirnames Liste an Ort und Stelle ändern kann (vielleicht del oder Slice Zuordnung verwendet wird) und walk() werden nur in die Unterverzeichnisse recursed, deren Namen in dirname bleiben; Dies kann verwendet werden, um die Suche zu beschneiden, eine bestimmte Reihenfolge des Besuchs aufzuerlegen, oder sogar walk() über Verzeichnisse, die der Anrufer erstellt oder umbenennt, bevor es wieder walk() wieder aufnimmt.

+0

Vielen Dank, wusste nicht, dass Sie die Listen an Ort und Stelle ändern können! – lolopop

+0

Ich habe das ausgeführt, aber es hat nichts auf die Konsole gedruckt. Wie sieht die typische Methode zum Anzeigen der gefundenen Dateien aus? Am Ende habe ich 'root, dirs, files' hinzugefügt, aber es kam sehr unordentlich heraus. – user5359531

+1

@ user5359531: Das hängt ganz von Ihrem Anwendungsfall ab; Sie könnten 'print '\ n'.join ([os.path.join (root, f) für f in dirs + files])', etc. –

5

Ich weiß, es war nicht in der Frage gestellt, aber ich hatte ein ähnliches Problem, wo ich mit __, speziell __pycache__ Verzeichnisse beginnen beide Dateien und Dateien ausschließen wollte. Ich bin bei dieser Frage gelandet, weil ich versucht habe herauszufinden, warum das Verständnis meiner Liste nicht so war, wie ich es erwartet hatte. Ich änderte die Liste nicht an Ort und Stelle mit dirnames[:].

habe ich eine Liste von Präfixen Ich mag so die dirnames anstelle auszuschließen und modifiziert wollte:

exclude_prefixes = ('__', '.') # exclusion prefixes 
    for dirpath, dirnames, filenames in os.walk(node): 
     # exclude all dirs starting with exclude_prefixes 
     dirnames[:] = [dirname 
         for dirname in dirnames 
         if not dirname.startswith(exclude_prefixes)] 
+0

das ist eine gute Antwort, funktioniert perfekt zum Ausschließen nach einer Liste – jpwynn

+1

FYI, 'startswith' kann auch ein Tupel von Strings nehmen, so dass Sie die innere for-Schleife loswerden und einfach' not dirname.startswith (exclude_prefixes) 'https://docs.python.org/2/library/stdtypes verwenden können .html # str.startswith (Python 2.5 und höher) –