Ich versuche mit Python eine Liste der Dateien in einem Verzeichnis abzurufen, möchte aber keine Liste ALLER Dateien.
Was ich im Wesentlichen möchte, ist die Fähigkeit, etwas wie das Folgende zu tun, aber Python zu verwenden und ls nicht auszuführen.
ls 145592*.jpg
Wenn es dafür keine integrierte Methode gibt, denke ich derzeit darüber nach, eine for-Schleife zu schreiben, um die Ergebnisse einer os.listdir()
zu durchlaufen und alle übereinstimmenden Dateien an eine neue Liste anzuhängen.
Es gibt jedoch viele Dateien in diesem Verzeichnis, und daher hoffe ich, dass es eine effizientere Methode (oder eine integrierte Methode) gibt.
Antworten:
glob.glob('145592*.jpg')
quelle
glob.glob('145592*.jpg')
Gibt den gesamten absoluten Pfad der Dateien aus, währendls 145592*.jpg
nur die Liste der Dateien gedruckt wird.glob()
schätze, ich habe mich auf die Tatsache bezogen, dass nur listdir + fnmatch verwendet wird, anstatt spezielle Betriebssystemaufrufe, um die Platzhalterfilterung durchzuführen. Unter WindowsFindFirstFile
können Sie beispielsweise mit der API Platzhalter angeben, damit das Betriebssystem die Filterung direkt und vermutlich effizienter durchführt (unter Linux gibt es meines Erachtens kein Äquivalent).glob.glob()
ist definitiv der Weg, es zu tun (gemäß Ignacio). Wenn Sie jedoch einen komplizierteren Abgleich benötigen, können Sie dies mit einem Listenverständnis tun und sore.match()
etwas wie:Flexibler, aber wie Sie bemerken, weniger effizient.
quelle
[0-9]+
[0123456789]
Sequenzen ( siehe Dokumente ) und hat auch diefnmatch.filter()
Funktion, die diese Schleife etwas effizienter macht.Halte es einfach:
Ich bevorzuge diese Form des Listenverständnisses, weil es sich gut auf Englisch liest.
Ich lese die vierte Zeile wie folgt: Geben Sie für jedes fn in os.listdir für meinen Pfad nur diejenigen an, die mit einer meiner enthaltenen Erweiterungen übereinstimmen.
Es kann für unerfahrene Python-Programmierer schwierig sein, sich wirklich an die Verwendung von Listenverständnissen zum Filtern zu gewöhnen, und es kann einen gewissen Speicheraufwand für sehr große Datenmengen verursachen, aber für das Auflisten eines Verzeichnisses und anderer einfacher Aufgaben zum Filtern von Zeichenfolgen führen Listenverständnisse zu einer saubereren Liste dokumentierbarer Code.
Das einzige an diesem Design ist, dass es Sie nicht vor dem Fehler schützt, eine Zeichenfolge anstelle einer Liste zu übergeben. Wenn Sie beispielsweise versehentlich eine Zeichenfolge in eine Liste konvertieren und am Ende alle Zeichen einer Zeichenfolge überprüfen, kann dies zu einer Reihe von Fehlalarmen führen.
Es ist jedoch besser, ein Problem zu haben, das leicht zu beheben ist, als eine Lösung, die schwer zu verstehen ist.
quelle
any()
, denn esstr.endswith()
dauert eine Folge von Endungen.if fn.endswith(included_extentensions)
ist mehr als genug.str.endswith(seq)
die Martijn nicht verwendet hat, ist dies nicht korrekt, da eine Datei enden.ext
muss, damit sie diese Erweiterung hat. Dieser Code findet auch (zum Beispiel) eine Datei mit dem Namen "myjpg" oder ein Verzeichnis mit dem Namen "png". Um dies zu beheben, stellen Sie jeder Erweiterung einfachincluded_extensions
ein vor.
.included_extensions
vsincluded_extentsions
? Schade, denn sonst ist dies meine bevorzugte Antwort.Andere Option:
https://docs.python.org/3/library/fnmatch.html
quelle
glob
in einer einzelnen Zeile geschieht.glob
der vollständige Pfad zurückgegeben wird und nichtos.listdir
nur der Dateiname. Zumindest passiert dies in Python 2.Filter mit
glob
Modul:Glob importieren
Platzhalter:
Fiter-Erweiterung
.txt
:Ein einzelnes Zeichen
Nummernkreise
Alphabetische Bereiche
quelle
Vorläufiger Code
Lösung 1 - Verwenden Sie "glob"
Lösung 2 - Verwenden Sie "os" + "fnmatch"
Variante 2.1 - Suche im aktuellen Verzeichnis
Variante 2.2 - Suche rekursiv
Ergebnis
Lösung 3 - Verwenden Sie "pathlib"
Anmerkungen:
quelle
Verwenden Sie os.walk, um Ihre Dateien rekursiv aufzulisten
quelle
file.endswith(alist_filter)
reicht.Dadurch erhalten Sie eine Liste der JPG-Dateien mit ihrem vollständigen Pfad. Sie können ersetzen
x[0]+"/"+f
mitf
nur Dateinamen für. Sie können auch durch einef.endswith(".jpg")
beliebige Zeichenfolgenbedingung ersetzen .quelle
Vielleicht möchten Sie auch einen übergeordneten Ansatz (den ich als findtools implementiert und verpackt habe ):
kann mit installiert werden
quelle
Dateinamen mit den Erweiterungen "jpg" und "png" in "path / to / images":
quelle
Sie können pathlib verwenden , das in der Python-Standardbibliothek 3.4 und höher verfügbar ist.
quelle
Sie können Muster definieren und danach suchen. Hier habe ich sowohl Start- als auch Endmuster genommen und sie im Dateinamen gesucht. DATEIEN enthält die Liste aller Dateien in einem Verzeichnis.
quelle
Wie wäre es mit str.split ()? Nichts zu importieren.
quelle
f.endswith('.jpg')
(wird aber auch ausgewähltfilename.jpg.ext
)Sie können subprocess.check_ouput () als verwenden
Natürlich kann die Zeichenfolge zwischen Anführungszeichen alles sein, was Sie in der Shell ausführen und die Ausgabe speichern möchten.
quelle
ls
Die Ausgabe sollte nicht analysiert werden .