Was ist der einfachste Weg, um die vollständige rekursive Liste von Dateien in einem Ordner mit Python zu bekommen? Ich weiß über os.walk()
, aber es scheint Overkill für nur die ungefilterte Liste aller Dateien zu bekommen. Ist es wirklich die einzige Option?Einfachster Weg, um das Äquivalent von "finden" zu erhalten. in Python?
Antwort
Es gibt nichts, was man verhindern, dass eine eigene Funktion zu erstellen:
import os
def listfiles(folder):
for root, folders, files in os.walk(folder):
for filename in folders + files:
yield os.path.join(root, filename)
Sie können es verwenden, etwa so:
for filename in listfiles('/etc/'):
print filename
Entweder das, oder manuell Rekursion mit isdir()
/isfile()
und listdir()
oder Sie könnten subprocess.check_output()
verwenden und find .
nennen. Basiziell os.walk()
ist höchste Ebene, etwas niedrigere Ebene ist semi-manuelle Lösung basierend auf listdir()
und wenn Sie möchten, dass die gleiche Ausgabe find .
Ihnen aus irgendeinem Grund geben Sie einen Systemanruf mit subprocess
.
+1 für 'os.walk()' verwenden. – Blender
import os
path = "path/to/your/dir"
for (path, dirs, files) in os.walk(path):
print files
diese trieben, oder bin ich etwas fehlt?
Sie haben absolut Recht. Es sieht viel schwieriger aus, als es tatsächlich ist. –
os.walk()
ist auf keinen Fall übertrieben.
files = [os.path.join(dirpath, filename)
for (dirpath, dirs, files) in os.walk('.')
for filename in (dirs + files)]
Sie können machen dieses zu einem Generator, nur Prozess einen Weg zu einem Zeitpunkt und sicher auf das Gedächtnis: Es kann Ihre Liste der Dateien und Verzeichnisse in einem Jiffy erzeugen.
+1 für die meisten Pythonic Lösung :) – kgr
Sie könnten auch das find
Programm selbst aus Python von sh
import sh
text_files = sh.find(".", "-iname", "*.txt")
Danke! Ich wollte nur sicherstellen, dass diese Funktion nicht bereits Teil der Standardbibliothek ist. –
Ich wünschte, man existiere. Sie können immer 'os.py' bearbeiten;) – Blender
Schöne Lösung! Aber "find." Listet auch Verzeichnisse auf. Die Lösung ist jedoch sehr einfach. :) –