Hier ist eine einzeilige Listenverständnisvariante von Pats Antwort (die auch beinhaltet, dass Sie in einem bestimmten Projektverzeichnis global arbeiten wollten):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Sie durchlaufen die Erweiterungen ( for ext in exts
) und nehmen dann für jede Erweiterung jede Datei, die dem Glob-Muster ( for f in glob.glob(os.path.join(project_dir, ext)
) entspricht.
Diese Lösung ist kurz und ohne unnötige for-Schleifen, verschachtelte Listenverständnisse oder Funktionen, die den Code überladen. Nur reines, ausdrucksstarkes, pythonisches Zen .
Mit dieser Lösung können Sie eine benutzerdefinierte Liste exts
erstellen, die geändert werden kann, ohne dass Sie Ihren Code aktualisieren müssen. (Dies ist immer eine gute Praxis!)
Das Listenverständnis ist das gleiche wie in Laurents Lösung (für die ich gestimmt habe). Aber ich würde argumentieren, dass es normalerweise nicht notwendig ist, eine einzelne Zeile einer separaten Funktion zuzuordnen, weshalb ich dies als alternative Lösung anbiete.
Bonus:
Wenn Sie nicht nur ein einzelnes Verzeichnis, sondern auch alle Unterverzeichnisse durchsuchen müssen, können Sie recursive=True
das Glob-Symbol **
1 für mehrere Verzeichnisse übergeben und verwenden :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Dies wird glob.glob('<project_dir>/**/*.txt', recursive=True)
für jede Erweiterung usw. aufgerufen.
1 Technisch gesehen entspricht das **
Glob-Symbol einfach einem oder mehreren Zeichen einschließlich Schrägstrich /
(im Gegensatz zum singulären *
Glob-Symbol). In der Praxis müssen Sie sich nur daran erinnern, dass **
es mit null oder mehr Verzeichnissen übereinstimmt , solange Sie mit Schrägstrichen (Pfadtrennzeichen) umgeben.