Ich arbeite an einem Skript, um rekursiv Unterordner in einem Hauptordner zu durchsuchen und eine Liste aus einem bestimmten Dateityp zu erstellen. Ich habe ein Problem mit dem Skript. Es ist derzeit wie folgt eingestellt
for root, subFolder, files in os.walk(PATH):
for item in files:
if item.endswith(".txt") :
fileNamePath = str(os.path.join(root,subFolder,item))
Das Problem besteht darin, dass die Variable subFolder eine Liste von Unterordnern anstelle des Ordners abruft, in dem sich die ITEM-Datei befindet. Ich dachte daran, vorher eine for-Schleife für den Unterordner auszuführen und den ersten Teil des Pfads zu verbinden, aber ich dachte mir, ich würde noch einmal prüfen, ob jemand vorher irgendwelche Vorschläge hat. Danke für Ihre Hilfe!
rglob
auf Windows-Plattformen unempfindlich ist - aber nicht unempfindlich.glob
(Python 3.6 hier):glob.iglob(os.path.join(real_source_path, '**', '*.[xX][mM][lL]')
iglob
funktioniert nicht für Dateien in Unterordnern oder darunter. Sie müssen hinzufügenrecursive=True
.glob.glob()
habe einen neuen rekursiven Parameter .Wenn Sie jede
.txt
Datei untermy_path
(rekursiv einschließlich Unterverzeichnisse) erhalten möchten:Wenn Sie einen Iterator benötigen, können Sie alternativ iglob verwenden :
quelle
files = glob.glob(PATH + '/*/**/*.txt', recursive=True)
?Ich werde das Listenverständnis von John La Rooy in verschachtelte für übersetzen, nur für den Fall, dass jemand anderes Probleme hat, es zu verstehen.
Sollte gleichbedeutend sein mit:
Hier ist die Dokumentation zum Listenverständnis und die Funktionen os.walk und glob.glob .
quelle
glob.glob(..., recursive=True)
undlist(Path(dir).glob(...'))
nicht.Dies scheint die schnellste Lösung zu sein, die ich finden konnte, und sie ist schneller als
os.walk
und viel schneller als jedeglob
andere Lösung .f.path
zuf.name
(nicht ändern , es für Unterordner!).Argumente :
dir: str, ext: list
.Die Funktion gibt zwei Listen zurück :
subfolders, files
.Unten finden Sie eine detaillierte Geschwindigkeitsanalyse.
Geschwindigkeitsanalyse
für verschiedene Methoden, um alle Dateien mit einer bestimmten Dateierweiterung in allen Unterordnern und im Hauptordner abzurufen.
tl; dr:
-
fast_scandir
gewinnt eindeutig und ist doppelt so schnell wie alle anderen Lösungen außer os.walk.-
os.walk
ist der zweite Platz etwas langsamer.- Die Verwendung
glob
verlangsamt den Prozess erheblich.- Keines der Ergebnisse verwendet eine natürliche Sortierung . Dies bedeutet, dass die Ergebnisse wie folgt sortiert werden: 1, 10, 2. Um eine natürliche Sortierung (1, 2, 10) zu erhalten, besuchen Sie bitte https://stackoverflow.com/a/48030307/2441026
Ergebnisse:
Die Tests wurden mit W7x64, Python 3.8.1, 20 Läufen durchgeführt. 16596 Dateien in 439 (teilweise verschachtelten) Unterordnern.
find_files
stammt von https://stackoverflow.com/a/45646357/2441026 und ermöglicht die Suche nach mehreren Erweiterungen.fast_scandir
wurde von mir geschrieben und wird auch eine Liste von Unterordnern zurückgeben. Sie können ihm eine Liste mit Erweiterungen geben, nach denen gesucht werden soll (ich habe eine Liste mit einem Eintrag zu einem einfachen getestetif ... == ".jpg"
und es gab keinen signifikanten Unterschied).quelle
Die neue
pathlib
Bibliothek vereinfacht dies auf eine Zeile:Sie können auch die Generatorversion verwenden:
Dies gibt
Path
Objekte zurück, die Sie für so ziemlich alles verwenden können, oder Sie erhalten den Dateinamen als Zeichenfolge vonfile.name
.quelle
Es ist nicht die pythonischste Antwort, aber ich werde es hier zum Spaß einfügen, weil es eine nette Lektion in Rekursion ist
Auf meinem Computer habe ich zwei Ordner
root
undroot2
Nehmen wir an, ich möchte
.txt
alle.mid
Dateien in einem dieser Verzeichnisse finden, dann kann ich es einfach tunquelle
Rekursiv ist neu in Python 3.5, daher funktioniert es unter Python 2.7 nicht. Hier ist das Beispiel, in dem
r
Zeichenfolgen verwendet werden , sodass Sie nur den Pfad angeben müssen, der entweder für Win, Lin, ... gilt.Hinweis: Es werden alle Dateien aufgelistet, egal wie tief sie gehen sollen.
quelle
Auf diese Weise können Sie eine Liste der absoluten Pfaddateien zurückgeben.
quelle
Wenn es Ihnen nichts ausmacht, eine zusätzliche Lichtbibliothek zu installieren, können Sie dies tun:
Verwendung:
Das Ergebnis sollte ungefähr so aussehen:
Es funktioniert sowohl mit Python 2.7 als auch mit Python 3.
Github: https://github.com/kyzas/plazy#list-files
Haftungsausschluss: Ich bin Autor von
plazy
.quelle
Diese Funktion fügt rekursiv nur Dateien in eine Liste ein. Hoffe das wirst du.
quelle
Ihre ursprüngliche Lösung war nahezu korrekt, aber die Variable "root" wird dynamisch aktualisiert, wenn sie rekursiv umhergeht. os.walk () ist ein rekursiver Generator. Jeder Tupel-Satz (root, subFolder, files) ist für ein bestimmtes root so, wie Sie es eingerichtet haben.
dh
Ich habe Ihren Code leicht angepasst, um eine vollständige Liste zu drucken.
Hoffe das hilft!
quelle