
Kürzlich hab ich einen etwas längeren Download angestoßen, der via Fire-and-Forget einfach alles gezogen hat, was er kriegen kann. Das bedeutet, dass es mit Sicherheit viele Pfade gibt, die keine Daten enthalten. Das Skript hat jedoch immer ein sogenanntes Pickle File abgelegt, das einfach nur das gerade benutzte Objekt serialisiert hat und auf Platte gespeichert. Die Ordnerstruktur sieht z.B. so aus:
|── 004ee81b2697d8c7-367448064 │ │ │ ├── 1951630894 │ │ ├── data.pickle │ │ └── Stargate Atlantis - 3x19 - Vengeance.srt │ │ │ ├── 1951630970 │ │ |__ data.pickle │ │ │ ├── 1951631043 │ │ |___ data.pickle │ │
Jetzt wollte ich einfach alle Ordner wissen, die nur dieses Pickle File enthalten, also quasi alle Ordner, die nur 1 Datei als Inhalt haben. Und wie immer gibt es da was Leckeres in Python. Das os - Modul kennt eine Methode walk() die rekursiv durch den Ordner düst und in jedem Durchgang einem den aktuellen Pfad, dessen Verzeichnisse und dessen Dateien zurückgibt in Form eines Tupels. Pythonisch wie man es halt gewohnt ist.
Hier ist das Snippet, wie ich das Verzeichnis, in dem ich mich befinde, rekursiv nach Ordnern suche, die nur eine Datei haben:
import os search_dir = "." for folder, subfolders, files in os.walk(search_dir): if not len(files) > 1: print folder
Tja, so einfach kann es sein.
Ach ja, os.walk() ist ein Generator, d.h. man muss mindestens eine For-Loop nutzen. Wenn man folgenden Fehler bekommt, benutzt man os.walk() nicht richtig:
ValueError: too many values to unpack