Wie finde ich alle Dateien in einem Verzeichnis mit der Erweiterung .txt
in Python?
1043
Sie können verwenden glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
oder einfach os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
oder wenn Sie das Verzeichnis durchlaufen möchten, verwenden Sie os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
als für,for files in f
da die Variable einen einzelnen Dateinamen enthält. Noch besser wäre es, dief
to-files
und dann die for-Schleifen zu ändernfor file in files
.file
ist kein reserviertes Wort, sondern nur der Name einer vordefinierten Funktion. Daher ist es durchaus möglich, es als Variablennamen in Ihrem eigenen Code zu verwenden. Obwohl es stimmt, dass solche Kollisionen im Allgemeinen vermieden werden sollten,file
ist dies ein Sonderfall, da es kaum erforderlich ist, sie zu verwenden, weshalb häufig eine Ausnahme von der Richtlinie in Betracht gezogen wird. Wenn Sie dies nicht möchten, empfiehlt PEP8, solchen Namen einen einzelnen Unterstrich hinzuzufügen, dhfile_
, dem Sie zustimmen müssen, dass er immer noch gut lesbar ist.Verwenden Sie glob .
quelle
glob
Dateien nicht rekursiv gefunden werden können, wenn Ihr Python unter 3.5 liegt. Weitere InformationenSo etwas sollte den Job machen
quelle
root, dirs, files
anstelle vonr, d, f
. Viel besser lesbar.So etwas wird funktionieren:
quelle
os.path.join
für jedes Element von verwendentext_files
. Es könnte so etwas seintext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Sie können einfach
pathlib
s 1 verwenden :glob
oder in einer Schleife:
Wenn Sie es rekursiv wollen, können Sie verwenden
.glob('**/*.txt)
1 Das
pathlib
Modul wurde in die Standardbibliothek in Python 3.4 aufgenommen. Sie können Back-Ports dieses Moduls jedoch auch auf älteren Python-Versionen installieren (z. B. mitconda
oderpip
):pathlib
undpathlib2
.quelle
**/*.txt
wird von älteren Python-Versionen nicht unterstützt. Also habe ich dies gelöst mit:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
tun ist, und ich habe bereits die Python-Versionsanforderungen aufgenommen. :) Aber wenn Ihr Ansatz noch nicht veröffentlicht wurde, fügen Sie ihn doch einfach als weitere Antwort hinzu.rglob
wenn Sie rekursiv nach Elementen suchen möchten. ZB.rglob('*.txt')
quelle
Ich mag os.walk () :
Oder mit Generatoren:
quelle
Hier sind weitere Versionen derselben, die leicht unterschiedliche Ergebnisse liefern:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
quelle
glob1()
es eine Hilfsfunktion imglob
Modul, die nicht in der Python-Dokumentation aufgeführt ist. Es gibt einige Inline-Kommentare, die beschreiben, was es in der Quelldatei tut, siehe.../Lib/glob.py
.glob.glob1()
ist nicht öffentlich, aber verfügbar für Python 2.4-2.7; 3.0-3.2; Pypy; jython github.com/zed/test_glob1glob
Modul extrahiert werden.path.py ist eine weitere Alternative: https://github.com/jaraco/path.py
quelle
for f in p.walk(pattern='*.txt')
go durch alle Unterordnerlist(p.glob('**/*.py'))
Python v3.5 +
Schnelle Methode mit os.scandir in einer rekursiven Funktion. Sucht nach allen Dateien mit einer angegebenen Erweiterung in Ordnern und Unterordnern.
Update April 2019
Wenn Sie über Verzeichnisse suchen, die 10.000 Dateien enthalten, wird das Anhängen an eine Liste ineffizient. Das Ergebnis zu erzielen ist eine bessere Lösung. Ich habe auch eine Funktion zum Konvertieren der Ausgabe in einen Pandas-Datenrahmen hinzugefügt.
quelle
Python verfügt über alle Tools, um dies zu tun:
quelle
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
So rufen Sie alle '.txt'-Dateinamen im Ordner' dataPath 'pythonisch als Liste ab:
quelle
Versuchen Sie dies, um alle Ihre Dateien rekursiv zu finden:
quelle
**
. Nur in Python 3 verfügbar. Was mir nicht gefällt, ist derchdir
Teil. Keinen Bedarf.filepath = os.path.join('wallpaper')
Nun , Sie könnten die OS-Bibliothek verwenden, um den Pfad zu verbinden, z. B., und ihn dann als verwendenglob.glob(filepath+"**/*.psd", recursive = True)
, was das gleiche Ergebnis liefern würde.quelle
Ich habe einen Test (Python 3.6.4, W7x64) durchgeführt, um festzustellen, welche Lösung für einen Ordner ohne Unterverzeichnisse am schnellsten ist, um eine Liste der vollständigen Dateipfade für Dateien mit einer bestimmten Erweiterung zu erhalten.
Um es kurz zu machen, diese Aufgabe
os.listdir()
ist die schnellste und 1,7-mal so schnell wie die nächstbeste:os.walk()
(mit einer Pause!), 2,7-mal so schnell wiepathlib
, 3,2-mal schneller alsos.scandir()
und 3,3-mal schneller alsglob
.Bitte beachten Sie, dass sich diese Ergebnisse ändern, wenn Sie rekursive Ergebnisse benötigen. Wenn Sie eine der folgenden Methoden kopieren / einfügen, fügen Sie bitte eine .lower () hinzu, da sonst .EXT bei der Suche nach .ext nicht gefunden wird.
Ergebnisse:
quelle
Dieser Code macht mein Leben einfacher.
quelle
Verwenden Sie fnmatch: https://docs.python.org/2/library/fnmatch.html
quelle
Um ein Array von ".txt" -Dateinamen aus einem Ordner namens "data" im selben Verzeichnis abzurufen, verwende ich normalerweise diese einfache Codezeile:
quelle
Ich empfehle Ihnen, fnmatch und die obere Methode zu verwenden. Auf diese Weise können Sie Folgendes finden:
.
quelle
Hier ist einer mit
extend()
quelle
.txt
:)Funktionslösung mit Unterverzeichnissen:
quelle
Wenn der Ordner viele Dateien enthält oder der Speicher eine Einschränkung darstellt, sollten Sie Generatoren verwenden:
Option A: Iterieren
Option B: Holen Sie sich alle
quelle
Eine kopierbare Lösung ähnlich der von Ghostdog:
quelle
Verwenden Sie das Python OS- Modul, um Dateien mit einer bestimmten Erweiterung zu finden.
Das einfache Beispiel ist hier:
quelle
Viele Benutzer haben mit
os.walk
Antworten geantwortet , die alle Dateien, aber auch alle Verzeichnisse und Unterverzeichnisse sowie deren Dateien enthalten.Oder für einen Einzelfall, bei dem Sie keinen Generator benötigen:
Wenn Sie Übereinstimmungen für etwas anderes verwenden möchten, möchten Sie möglicherweise eine Liste anstelle eines Generatorausdrucks erstellen:
quelle
Eine einfache Methode mit
for
loop:Dies kann jedoch verallgemeinert werden.
quelle