Python 3.5+
Da Sie auf einer neuen Python sind, sollten Sie pathlib.Path.rglob
aus dem pathlib
Modul verwenden.
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Wenn Sie pathlib nicht verwenden möchten, verwenden Sie einfach glob.glob
, aber vergessen Sie nicht, den recursive
Schlüsselwortparameter zu übergeben.
Für Fälle, in denen übereinstimmende Dateien mit einem Punkt (.) Beginnen; Verwenden Sie wie Dateien im aktuellen Verzeichnis oder versteckte Dateien auf einem Unix-basierten System dieos.walk
Lösung.
Ältere Python-Versionen
Verwenden Sie bei älteren Python-Versionen, um os.walk
ein Verzeichnis rekursiv zu durchsuchen und fnmatch.filter
mit einem einfachen Ausdruck abzugleichen:
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
for filename in fnmatch.filter(filenames, '*.c'):
matches.append(os.path.join(root, filename))
os.path.walk()
etwas, das etwas umständlicher zu verwenden ist alsos.walk()
os.path.walk()
veraltet ist und in Python 3 entfernt wurde.pathlib.Path('src').glob('**/*.c')
sollte funktionieren.Ähnlich wie bei anderen Lösungen, jedoch mit fnmatch.fnmatch anstelle von glob, da os.walk bereits die Dateinamen aufgelistet hat:
Wenn Sie einen Generator verwenden, können Sie jede gefundene Datei so verarbeiten, wie sie gefunden wurde, anstatt alle Dateien zu finden und sie dann zu verarbeiten.
quelle
reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Ich habe das Glob-Modul so geändert, dass es ** für rekursives Globbing unterstützt, z.
https://github.com/miracle2k/python-glob2/
Nützlich, wenn Sie Ihren Benutzern die Möglichkeit geben möchten, die ** -Syntax zu verwenden, und daher ist os.walk () allein nicht gut genug.
quelle
**
mit dem offiziellen Glob-Modul zu aktivieren , gehen Sie wieglob(path, recursive=True)
Ab Python 3.4 kann die
glob()
Methode einer derPath
Klassen im neuen Pathlib- Modul verwendet werden, das**
Platzhalter unterstützt . Zum Beispiel:Update: Ab Python 3.5 wird dieselbe Syntax auch von unterstützt
glob.glob()
.quelle
fnmatch
gibt Ihnen genau die gleichen Muster wieglob
, also ist dies wirklich ein ausgezeichneter Ersatz fürglob.glob
mit sehr enger Semantik. Eine iterative Version (z. B. ein Generator), für die IOW ein Ersatz istglob.iglob
, ist eine triviale Anpassung (nuryield
die Zwischenergebnisse, anstattextend
eine einzelne Ergebnisliste zu erstellen, die am Ende zurückgegeben wird).quelle
recursive_glob(pattern, treeroot='.')
wie ich sie in meiner Bearbeitung vorgeschlagen habe? Auf diese Weise kann es beispielsweise aufgerufen werdenrecursive_glob('*.txt')
und intuitiv der Syntax von entsprechenglob
.fnmatch.filter
, was ungefähr so nützlich ist wie die Möglichkeit, einzelne Argumente abzugleichenglob.glob
.Für Python> = 3.5 können Sie verwenden
**
,recursive=True
:Demo
quelle
Sie möchten verwenden
os.walk
, um Dateinamen zu sammeln, die Ihren Kriterien entsprechen. Zum Beispiel:quelle
Hier ist eine Lösung mit verschachteltem Listenverständnis
os.walk
und einfachem Suffixabgleich anstelle vonglob
:Es kann zu einem Einzeiler komprimiert werden:
oder verallgemeinert als Funktion:
Wenn Sie vollständige
glob
Stilmuster benötigen , können Sie dem Beispiel von Alex und Bruno folgen und Folgendes verwendenfnmatch
:quelle
Vor kurzem musste ich meine Bilder mit der Erweiterung .jpg wiederherstellen. Ich habe photorec ausgeführt und 4579 Verzeichnisse mit 2,2 Millionen Dateien und einer enormen Vielfalt an Erweiterungen wiederhergestellt. Mit dem folgenden Skript konnte ich innerhalb von Minuten 50133 Dateien mit der Erweiterung .jpg auswählen:
quelle
Überlegen Sie
pathlib.rglob()
.Siehe auch @ taleinats verwandten Beitrag hier und einen ähnlichen Beitrag an anderer Stelle.
quelle
Johan und Bruno bieten exzellente Lösungen für die angegebenen Mindestanforderungen. Ich habe gerade freigegeben Formic die Geräte Ant FileSet und Globs , die diese und weitere komplizierte Szenarien umgehen kann. Eine Implementierung Ihrer Anforderung ist:
quelle
Basierend auf anderen Antworten ist dies meine aktuelle Arbeitsimplementierung, die verschachtelte XML-Dateien in einem Stammverzeichnis abruft:
Ich habe wirklich Spaß mit Python :)
quelle
Eine andere Möglichkeit, dies nur mit dem Glob-Modul zu tun. Setzen Sie einfach die rglob-Methode mit einem Start-Basisverzeichnis und einem passenden Muster, und es wird eine Liste der übereinstimmenden Dateinamen zurückgegeben.
quelle
Für Python 3.5 und höher
weiter könnten Sie brauchen
quelle
/**
funktioniert es für mich so:file_names_array = glob.glob('src/**/*.c', recursive=True)
Oder mit einem Listenverständnis:
quelle
Gerade gemacht .. es wird Dateien und Verzeichnisse auf hierarchische Weise drucken
Aber ich habe weder Fnmatch noch Walk benutzt
quelle
Dieser verwendet fnmatch oder regulären Ausdruck:
quelle
Zusätzlich zu den vorgeschlagenen Antworten können Sie dies mit etwas Magie der faulen Generierung und des Listenverständnisses tun:
Dies passt nicht nur in eine Zeile und vermeidet unnötige Listen im Speicher, sondern hat auch den netten Nebeneffekt, dass Sie es auf ähnliche Weise wie den Operator ** verwenden können, z. B.
os.path.join(root, 'some/path/*.c')
um alle .c-Dateien in allen zu erhalten Unterverzeichnisse von src, die diese Struktur haben.quelle
Dies ist ein Arbeitscode für Python 2.7. Im Rahmen meiner Devops-Arbeit musste ich ein Skript schreiben, mit dem die mit live-appName.properties gekennzeichneten Konfigurationsdateien nach appName.properties verschoben werden. Es könnte auch andere Erweiterungsdateien wie live-appName.xml geben.
Unten finden Sie einen Arbeitscode dafür, der die Dateien in den angegebenen Verzeichnissen (verschachtelte Ebene) findet und sie dann in den erforderlichen Dateinamen umbenennt (verschiebt)
Diese Funktion wird von einem Hauptskript aus aufgerufen
Ich hoffe, dies hilft jemandem, der mit ähnlichen Problemen zu kämpfen hat.
quelle
Vereinfachte Version von Johan Dahlins Antwort ohne Fnmatch .
quelle
Hier ist meine Lösung, die das Listenverständnis verwendet, um rekursiv in einem Verzeichnis und allen Unterverzeichnissen nach mehreren Dateierweiterungen zu suchen :
quelle
quelle
Ich habe die Top-Antwort in diesem Beitrag geändert. Und kürzlich dieses Skript erstellt, das alle Dateien in einem bestimmten Verzeichnis (Suchverzeichnis) und den Unterverzeichnissen darunter durchläuft ... und Dateiname, Stammverzeichnis, Änderungs- / Erstellungsdatum und Größe.
Hoffe das hilft jemandem ... und er kann das Verzeichnis durchgehen und fileinfo bekommen.
quelle
Hier ist eine Lösung, die das Muster mit dem vollständigen Pfad und nicht nur mit dem Basisdateinamen vergleicht.
Es verwendet
fnmatch.translate
, um ein Muster im Glob-Stil in einen regulären Ausdruck zu konvertieren, der dann mit dem vollständigen Pfad jeder Datei verglichen wird, die beim Durchsuchen des Verzeichnisses gefunden wurde.re.IGNORECASE
ist optional, aber unter Windows wünschenswert, da das Dateisystem selbst nicht zwischen Groß- und Kleinschreibung unterscheidet. (Ich habe mich nicht darum gekümmert, den regulären Ausdruck zu kompilieren, da Dokumente angeben, dass er intern zwischengespeichert werden sollte.)quelle
Ich brauchte eine Lösung für Python 2.x , die in großen Verzeichnissen schnell funktioniert .
Ich beende damit:
Beachten Sie, dass Sie möglicherweise eine Ausnahmebehandlung benötigen, falls
ls
keine passende Datei gefunden wird.quelle
ls src/**/*.c
nur funktioniert, wenn die Globstar-Option aktiviert ist (shopt -s globstar
). Weitere Informationen finden Sie in dieser Antwort .