Ich habe ein Verzeichnis mit einer Reihe von Dateien : eee2314
, asd3442
... und eph
.
Ich möchte alle Dateien ausschließen, die eph
mit der glob
Funktion beginnen.
Wie kann ich es tun?
Die Musterregeln für glob sind keine regulären Ausdrücke. Stattdessen folgen sie den Standardregeln für die Unix-Pfaderweiterung. Es gibt nur wenige Sonderzeichen: Zwei verschiedene Platzhalter und Zeichenbereiche werden unterstützt [von glob ].
Sie können also einige Dateien mit Mustern ausschließen.
Um beispielsweise Manifestdateien (Dateien, die mit beginnen _
) mit glob auszuschließen , können Sie Folgendes verwenden:
files = glob.glob('files_path/[!_]*')
eph
, die mit etwas anderem beginnen, aber mit etwas anderem beginnen können.[!e][!p][!h]
filtert beispielsweise Dateien heraus, die mit beginneneee
.Sie können Sätze abziehen:
quelle
set(glob("*")) - set(glob("eph*"))
(und beachten Sie * am Ende von "eph *")list(set(glob("*")) - set(glob("eph")))
Sie können Muster mit der
glob
Funktion nicht ausschließen. Globs erlauben nur Einschlussmuster . Die Globbing-Syntax ist sehr begrenzt (selbst eine[!..]
Zeichenklasse muss mit einem Zeichen übereinstimmen, daher handelt es sich um ein Einschlussmuster für jedes Zeichen, das nicht zur Klasse gehört).Sie müssen Ihre eigene Filterung durchführen. Ein Listenverständnis funktioniert hier normalerweise gut:
quelle
iglob
hier, um zu vermeiden, dass die vollständige Liste im Speicher gespeichert wirdiglob
erzeugt sowieso Listen ; Alles, was Sie tun, ist, den Filter träge auszuwerten. Es wird nicht helfen, den Speicherbedarf zu verringern.os.listdir()
Ergebnis beim Iterieren im Speicher gespeichert. Sie müssensomepath/*.txt
jedoch alle Dateinamen in einem Verzeichnis im Speicher lesen und diese Liste dann auf nur die übereinstimmenden reduzieren.glob.glob(x) = list(glob.iglob(x))
. Nicht viel Aufwand, aber immer noch gut zu wissen.Spät zum Spiel, aber Sie können alternativ auch einfach eine Python
filter
auf das Ergebnis vonglob
:oder Ersetzen des Lambda durch eine entsprechende Regex-Suche usw.
EDIT: Ich habe gerade festgestellt, dass wenn Sie vollständige Pfade verwenden
startswith
, dies nicht funktioniert, sodass Sie einen regulären Ausdruck benötigenquelle
Wie wäre es, wenn Sie die bestimmte Datei überspringen, während Sie alle Dateien im Ordner durchlaufen? Der folgende Code überspringt alle Excel-Dateien, die mit 'eph' beginnen.
Auf diese Weise können Sie komplexere Regex-Muster verwenden, um einen bestimmten Satz von Dateien in einem Ordner einzuschließen / auszuschließen.
quelle
Vergleichen Sie mit
glob
, ich empfehlepathlib
, Filter ein Muster ist sehr einfach.und wenn Sie komplexere Muster filtern möchten, können Sie eine Funktion definieren, um dies zu tun, genau wie:
Mit diesem Code können Sie alle Dateien filtern, die mit
eph
oder beginnenepi
.quelle
Um Dateien auszuschließen, die nicht mit einem regulären Shell-Ausdruck übereinstimmen, können Sie im Allgemeinen das folgende Modul verwenden
fnmatch
:Das Obige generiert zuerst eine Liste aus einem bestimmten Pfad und zeigt als nächstes die Dateien an, die den regulären Ausdruck nicht mit der gewünschten Einschränkung erfüllen.
quelle
Wie in der akzeptierten Antwort erwähnt, können Sie Muster mit glob nicht ausschließen. Im Folgenden finden Sie eine Methode zum Filtern Ihres Glob-Ergebnisses.
Die akzeptierte Antwort ist wahrscheinlich die beste pythonische Methode, um Dinge zu tun. Wenn Sie jedoch der Meinung sind, dass Listenverständnisse etwas hässlich aussehen und Ihren Code ohnehin maximal numpythonisch machen möchten (wie ich), können Sie dies tun (beachten Sie jedoch, dass dies wahrscheinlich weniger effizient ist als die Listenverständnismethode):
(In meinem Fall hatte ich einige Bilderrahmen, Schrägrahmen und flache Rahmen in einem Verzeichnis und wollte nur die Bilderrahmen)
quelle
Wenn die Position des Zeichens nicht wichtig ist, z. B. um Manifestdateien (wo immer sie gefunden werden
_
) mitglob
undre
- regulären Ausdrucksoperationen auszuschließen , können Sie Folgendes verwenden:Oder eleganter mit -
list comprehension
quelle
Sie können die folgende Methode verwenden:
quelle