Gibt es eine bessere Möglichkeit, glob.glob in Python zu verwenden, um eine Liste mehrerer Dateitypen wie .txt, .mdown und .markdown abzurufen? Im Moment habe ich so etwas:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Antworten:
Vielleicht gibt es einen besseren Weg, aber wie wäre es mit:
Vielleicht gibt es einen anderen Weg, also warten Sie, falls jemand anderes eine bessere Antwort findet.
quelle
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Wenn Sie einen Pfad angeben müssen, durchlaufen Sie Übereinstimmungsmuster und lassen Sie den Join der Einfachheit halber in der Schleife:
quelle
glob
Gibt eine Liste zurück: Warum nicht einfach mehrmals ausführen und die Ergebnisse verketten?quelle
ProjectFiles
zuprojectFiles
, aber große Lösung.Verketten Sie die Ergebnisse:
Dann:
quelle
chain.from_iterable
. Das ist also ähnlich, aber weniger lesbar :it.chain(*(glob.iglob(pattern) for pattern in patterns))
.So viele Antworten, die darauf hindeuten, dass die Anzahl der Erweiterungen so oft wie die Anzahl der Erweiterungen erhöht wird. Ich würde es vorziehen, stattdessen nur einmal zu globalisieren:
quelle
mit glob ist das nicht möglich. Sie können nur verwenden:
* passt alles
? stimmt mit einem einzelnen Zeichen überein
[seq] stimmt mit einem beliebigen Zeichen in seq
überein [! seq] stimmt mit einem beliebigen Zeichen überein, das nicht in seq
Verwenden Sie os.listdir und einen regulären Ausdruck, um Muster zu überprüfen:
quelle
itertools
weil nachfolgende Musteränderungen auch hackig sein müssen (sagen Sie, Sie möchten Groß- und Kleinschreibung zulassen). . Oh, und es könnte sauberer sein zu schreiben'.*\.(txt|sql)'
Für
*.mp3
und*.flac
in mehreren Ordnern können Sie beispielsweise Folgendes tun:Die Idee kann auf mehr Dateierweiterungen erweitert werden, aber Sie müssen überprüfen, ob die Kombinationen werden keine andere unerwünschte Dateierweiterung übereinstimmen auf diesen Ordner haben. Also sei vorsichtig damit.
Sie können Folgendes tun, um eine beliebige Liste von Erweiterungen automatisch zu einem einzelnen Glob-Muster zu kombinieren:
quelle
Ein Einzeiler, nur zum Teufel ..
Ausgabe:
quelle
Nachdem ich hierher gekommen war, um Hilfe zu holen, machte ich meine eigene Lösung und wollte sie teilen. Es basiert auf der Antwort von user2363986, aber ich denke, das ist skalierbarer. Das heißt, wenn Sie 1000 Erweiterungen haben, sieht der Code immer noch etwas elegant aus.
quelle
directoryPath = "/Users/bla/bla/images_dir*."
quelle
Während Pythons Standard-Glob nicht wirklich nach Bashs Glob folgt, können Sie dies mit anderen Bibliotheken tun. Wir können geschweifte Klammern in wcmatchs Glob aktivieren .
Sie können sogar erweiterte Glob-Muster verwenden, wenn Sie dies bevorzugen:
quelle
recursive
Flaggeglob.GLOBSTAR
FlaggeIch habe freigegeben Formic die Geräte mehr umfasst in ähnlicher Weise wie Apache Ant FileSet und Globs .
Die Suche kann implementiert werden:
Da der vollständige Ant glob implementiert ist, können Sie jedem Muster verschiedene Verzeichnisse hinzufügen, sodass Sie nur die TXT-Dateien in einem Unterverzeichnis und die Markierung in einem anderen auswählen können, zum Beispiel:
Ich hoffe das hilft.
quelle
Die folgenden Funktionsklumpen
_glob
für mehrere Dateierweiterungen.quelle
Dies ist eine Python 3.4+
pathlib
Lösung:Außerdem werden alle Dateinamen ignoriert, die mit beginnen
~
.quelle
Hier ist eine einzeilige Listenverständnisvariante von Pats Antwort (die auch beinhaltet, dass Sie in einem bestimmten Projektverzeichnis global arbeiten wollten):
Sie durchlaufen die Erweiterungen (
for ext in exts
) und nehmen dann für jede Erweiterung jede Datei, die dem Glob-Muster (for f in glob.glob(os.path.join(project_dir, ext)
) entspricht.Diese Lösung ist kurz und ohne unnötige for-Schleifen, verschachtelte Listenverständnisse oder Funktionen, die den Code überladen. Nur reines, ausdrucksstarkes, pythonisches Zen .
Mit dieser Lösung können Sie eine benutzerdefinierte Liste
exts
erstellen, die geändert werden kann, ohne dass Sie Ihren Code aktualisieren müssen. (Dies ist immer eine gute Praxis!)Das Listenverständnis ist das gleiche wie in Laurents Lösung (für die ich gestimmt habe). Aber ich würde argumentieren, dass es normalerweise nicht notwendig ist, eine einzelne Zeile einer separaten Funktion zuzuordnen, weshalb ich dies als alternative Lösung anbiete.
Bonus:
Wenn Sie nicht nur ein einzelnes Verzeichnis, sondern auch alle Unterverzeichnisse durchsuchen müssen, können Sie
recursive=True
das Glob-Symbol**
1 für mehrere Verzeichnisse übergeben und verwenden :Dies wird
glob.glob('<project_dir>/**/*.txt', recursive=True)
für jede Erweiterung usw. aufgerufen.1 Technisch gesehen entspricht das
**
Glob-Symbol einfach einem oder mehreren Zeichen einschließlich Schrägstrich/
(im Gegensatz zum singulären*
Glob-Symbol). In der Praxis müssen Sie sich nur daran erinnern, dass**
es mit null oder mehr Verzeichnissen übereinstimmt , solange Sie mit Schrägstrichen (Pfadtrennzeichen) umgeben.quelle
Nicht
glob
, aber hier ist eine andere Möglichkeit, ein Listenverständnis zu verwenden:quelle
Sie können versuchen, eine manuelle Liste zu erstellen, in der die vorhandene Erweiterung mit den von Ihnen benötigten erweitert wird.
quelle
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
quelle
Bei
glob
mehreren Dateitypen müssen Sie dieglob()
Funktion mehrmals in einer Schleife aufrufen . Da diese Funktion eine Liste zurückgibt, müssen Sie die Listen verketten.Zum Beispiel erledigt diese Funktion die Aufgabe:
Einfache Verwendung:
Sie können auch
glob.iglob()
einen Iterator verwenden:quelle
Verwenden Sie eine Liste mit Erweiterungen und durchlaufen Sie diese
quelle
Sie könnten Filter verwenden:
quelle
Sie könnten auch
reduce()
so verwenden:Dadurch wird
glob.glob()
für jedes Muster eine Liste erstellt und auf eine einzelne Liste reduziert.quelle
Ein Glob, viele Erweiterungen ... aber unvollständige Lösung (könnte mit anderen Dateien übereinstimmen).
quelle
Ich hatte das gleiche Problem und das habe ich mir ausgedacht
quelle
Noch eine andere Lösung (verwenden Sie
glob
diese Option, um Pfade mit mehreren Übereinstimmungenpatterns
abzurufen und alle Pfade mitreduce
und zu einer einzigen Liste zu kombinierenadd
):quelle
Wenn Sie verwenden,
pathlib
versuchen Sie Folgendes:quelle
Durch die Ergebnisse, die ich aus empirischen Tests erhalten habe, stellte sich heraus, dass dies
glob.glob
nicht der bessere Weg ist, Dateien nach ihren Erweiterungen herauszufiltern. Einige der Gründe sind:Ich habe (auf Richtigkeit und Effizienz in der Zeit) die folgenden
4
verschiedenen Methoden getestet , um Dateien nach Erweiterungen herauszufiltern und sie in eine zu setzenlist
:Durch Ausführen des obigen Codes auf meinem Laptop habe ich die folgenden automatisch erklärenden Ergebnisse erhalten.
Der schnellste Weg, Dateien nach Erweiterungen herauszufiltern, ist sogar der hässlichste. Das heißt, verschachtelte
for
Schleifen undstring
Vergleich mit derendswith()
Methode.Darüber hinaus liefern, wie Sie sehen können, die Globbing-Algorithmen (mit dem Muster
E:\x\y\z\**/*[py][pyc]
) auch bei nur2
gegebener Erweiterung (py
undpyc
) auch falsche Ergebnisse.quelle
quelle
Das sollte funktionieren:
quelle
Beispielsweise:
Eine Funktion:
quelle