
130834
04.03.2018
Chaos mit Listen
Hallo liebe Administratoren.
Ich versuche gerade rekursive Datei-Suche mit Ordner-Ausschließung zu programmieren.
Das scheint mit os.walk so weit zu funktionieren. Nur ein Problem:
Verwende ich in der exclude-Liste 1 Element, wird dieses erfolgreich gefiltert.
Verwende ich mehrere, funktioniert gar nichts, d.h. alle Ordner werden genommen.
Der Code sieht wie folgt aus:
sources verwendet:
python - exclude directories in os.walk
Jemand ne Idee was ich da falsch gemacht habe?
danke im vorraus,
lg clragon
Ich versuche gerade rekursive Datei-Suche mit Ordner-Ausschließung zu programmieren.
Das scheint mit os.walk so weit zu funktionieren. Nur ein Problem:
Verwende ich in der exclude-Liste 1 Element, wird dieses erfolgreich gefiltert.
Verwende ich mehrere, funktioniert gar nichts, d.h. alle Ordner werden genommen.
Der Code sieht wie folgt aus:
# Die Liste mit den ordner die ich filtern möchte.
exclude = ["microsoft", "windows", "recycle", "program", "appdata"]
# Unkommentiert man die Linie unter dieser, funktioniert es. Lässt man es wie es gerade ist, wird kein Ordner gefiltert.
# exclude = ["program"]
# Liste mit Datei-Endungen.
exts = ['.txt', '.png']
# Loop mit der Ausgabe von einem os.walk durch C
for root, dirs, files in os.walk("C:\\", topdown=True, followlinks=False):
# Der Filter für die Ordner
dirs[:] = [dir for dir in dirs if any(excl.upper() not in dir.upper() for excl in exclude)]
# Datei-Filter ( funktioniert soweit )
files = [ file for file in files if file.endswith(tuple(exts)) ]
# Ausgabe in die Konsole schreiben.
for file in files:
print(os.path.join(root, file +"\n"))
sources verwendet:
python - exclude directories in os.walk
Jemand ne Idee was ich da falsch gemacht habe?
danke im vorraus,
lg clragon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 366889
Url: https://administrator.de/forum/chaos-mit-listen-366889.html
Ausgedruckt am: 11.05.2025 um 17:05 Uhr
5 Kommentare
Neuester Kommentar
Servus,
schreibe die Filter Zeile 11 so:
Wobei ich natürlich die Subliste
vorher noch in eine Variable schreiben würde, so dass sie nicht bei jedem Schleifenaufruf erneut erstellt werden muss.
Grüße Uwe
schreibe die Filter Zeile 11 so:
dirs[:] = [dir for dir in dirs if dir.upper() not in (ex.upper() for ex in exclude)]
(ex.upper() for ex in exclude)
vorher noch in eine Variable schreiben würde, so dass sie nicht bei jedem Schleifenaufruf erneut erstellt werden muss.
Grüße Uwe
Zitat von @130834:
Das wäre einen nette Lösung nur leider hatte ich die schon. Das Problem dabei ist, das die Liste exclude nur Bruchstücke der Wörter enthält um breiter zu filtern. Zum Beispiel, steht nur "Program" drin und nicht "Program Files (x86)".
Diese Linie hatte ich schon und soweit ich weiß würde es dann nur noch funktionieren wenn dir == any(exclude), also exakter match.
Wenn diese doch nicht ganz unwichtige Anforderung in deinem Post auch direkt gestanden hätte, hätte ich dir auch direkt die passende Lösung bringen können Das wäre einen nette Lösung nur leider hatte ich die schon. Das Problem dabei ist, das die Liste exclude nur Bruchstücke der Wörter enthält um breiter zu filtern. Zum Beispiel, steht nur "Program" drin und nicht "Program Files (x86)".
Diese Linie hatte ich schon und soweit ich weiß würde es dann nur noch funktionieren wenn dir == any(exclude), also exakter match.
Hiermit können deine Such-Strings im Array "exclude" Regex-Patterns sein
import os, re
# Die Liste mit den ordner die ich filtern möchte.
exclude = ["microsoft", "windows", "recycle", "program", "appdata"]
# Liste mit Datei-Endungen.
exts = ['.txt', '.png']
# Loop mit der Ausgabe von einem os.walk durch C
for root, dirs, files in os.walk("A:\\quelle", topdown=True, followlinks=False):
# Der Filter für die Ordner
dirs[:] = filter(lambda x : not re.search("|".join(exclude),x,re.IGNORECASE) , dirs)
# Datei-Filter
files = [ file for file in files if file.endswith(tuple(exts)) ]
# Ausgabe in die Konsole schreiben.
for file in files:
print(os.path.join(root, file +"\n"))
Alternativ wenn die Suchworte keine Regex-Patterns beinhalten sollen (Falls ein nicht Regex affiner User diese Liste erstellt) dann schreibe die Filterzeile 11 so:
Gibt bestimmt noch diverse andere Lösungen, aber ich mache derzeit nicht so viel mit Python.
dirs[:] = filter(lambda x : not re.search("|".join([re.escape(ex) for ex in exclude]),x,re.IGNORECASE) , dirs)
Gibt bestimmt noch diverse andere Lösungen, aber ich mache derzeit nicht so viel mit Python.