GNU/Linux >> LINUX-Kenntnisse >  >> Linux

os.walk ohne versteckte Ordner

Mir ist klar, dass es in der Frage nicht gestellt wurde, aber ich hatte ein ähnliches Problem, bei dem ich sowohl versteckte Dateien als auch Dateien ausschließen wollte, die mit __ beginnen , insbesondere __pycache__ Verzeichnisse. Ich bin auf diese Frage gelandet, weil ich versucht habe herauszufinden, warum mein Listenverständnis nicht das tut, was ich erwartet habe. Ich habe die vorhandene Liste nicht mit dirnames[:] geändert .

Ich habe eine Liste von Präfixen erstellt, die ich ausschließen wollte, und die Verzeichnisse wie folgt geändert:

    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)]

Mein Anwendungsfall ähnelte dem von OP, außer dass ich eine Anzahl der Gesamtzahl der Unterverzeichnisse in einem bestimmten Ordner zurückgeben wollte. In meinem Fall wollte ich alle Unterverzeichnisse mit dem Namen .git weglassen (sowie alle Ordner, die in diesen .git verschachtelt sein können Ordner).

In Python 3.6.7 stellte ich fest, dass der Ansatz der akzeptierten Antwort nicht funktionierte – es wurden alle .git gezählt Ordner und deren Unterordner. Folgendes hat bei mir funktioniert:

num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
    if '.git' in dirs:
        dirs.remove('.git')
    num_local_subdir += (len(dirs))

Nein, es gibt keine Option für os.walk() das überspringt diese. Sie müssen dies selbst tun (was ganz einfach 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

Beachten Sie die dirs[:] = Slice-Zuweisung; os.walk durchläuft rekursiv die in dirs aufgelisteten Unterverzeichnisse . Durch Ersetzen der Elemente von dirs mit denen, die ein Kriterium erfüllen (z. B. Verzeichnisse, deren Namen nicht mit . beginnen ), os.walk() besucht keine Verzeichnisse, die die Kriterien nicht erfüllen.

Dies funktioniert nur, wenn Sie den topdown beibehalten Schlüsselwortargument zu True , aus der Dokumentation von os.walk() :

Wenn topdown ist True , kann der Aufrufer die dirnames-Liste direkt ändern (vielleicht mit del oder Slice-Zuweisung) und walk() wird nur in die Unterverzeichnisse rekursiv, deren Namen in dirnames bleiben; Dies kann verwendet werden, um die Suche einzuschränken, eine bestimmte Besuchsreihenfolge festzulegen oder sogar walk() zu informieren über Verzeichnisse, die der Aufrufer erstellt oder umbenennt, bevor er fortfährt walk() nochmal.


Linux
  1. Ordner mit Mv zusammenführen?

  2. Dateien ohne Trennzeichen einfügen?

  3. Mv überschreibt schreibgeschützte Datei ohne Aufforderung?

  4. Root-Passwort per Sudo ändern, ohne Su?

  5. Liste der Verzeichnisse ohne nachgestellten Schrägstrich /

Ordner ausblenden und versteckte Dateien in Ubuntu Linux anzeigen [Anfängertrick]

So sehen Sie versteckte Dateien und Ordner in Debian

So zeigen Sie versteckte Dateien und Ordner im Ubuntu-Dateimanager an

So verstecken Sie Dateien und Ordner im Dateimanager ohne Umbenennung

So komprimieren Sie Ordner unter Linux

Bash:ls * ohne Ordnergruppierung