Ich möchte eine Reihe von Unterordnern in einem Ordner öffnen, einige Textdateien suchen und einige Zeilen der Textdateien drucken. Ich benutze dies:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Dies kann jedoch auch nicht auf die Unterordner zugreifen. Weiß jemand, wie ich mit demselben Befehl auch auf Unterordner zugreifen kann?
python
filesystems
glob
fnmatch
UserYmY
quelle
quelle
Antworten:
Verwenden Sie in Python 3.5 und höher die neue rekursive
**/
Funktionalität:Wenn
recursive
festgelegt,**
gefolgt von einem Pfadtrennzeichen, das mit 0 oder mehr Unterverzeichnissen übereinstimmt.In früheren Python-Versionen
glob.glob()
können Dateien in Unterverzeichnissen nicht rekursiv aufgelistet werden.In diesem Fall würde ich stattdessen
os.walk()
kombiniert mitfnmatch.filter()
verwenden:Dadurch werden Ihre Verzeichnisse rekursiv durchsucht und alle absoluten Pfadnamen an übereinstimmende
.txt
Dateien zurückgegeben. In diesem speziellen Fallfnmatch.filter()
kann es zu einem Overkill kommen. Sie können auch einen.endswith()
Test verwenden:quelle
path to directory
.recursive=False
zusammen mit der**/
Funktionalität nicht die Liste der Dateien nur im angegebenen Ordner, sondern in den untergeordneten Ordnern?**/
Gibt eine Liste der Verzeichnisnamen im aktuellen Arbeitsverzeichnis an, da das Muster mit endet/
undrecursive=False
Sie im Grunde genommen ein Doppel haben*
, das genauso übereinstimmt wie*/
, nur weniger effizient.*/*
Sie diese Option, wenn Sie alle Dateien in allen Unterverzeichnissen benötigen.So finden Sie Dateien in unmittelbaren Unterverzeichnissen:
Für eine rekursive Version, die alle Unterverzeichnisse durchläuft, können Sie seit Python 3.5 Folgendes verwenden
**
und übergeben :recursive=True
Beide Funktionsaufrufe geben Listen zurück. Sie können
glob.iglob()
Pfade einzeln zurückgeben. Oder verwenden Siepathlib
:Beide Methoden geben Iteratoren zurück (Sie können Pfade einzeln abrufen).
quelle
glob()
, Muster in Verzeichnissen zu unterstützen.**
Rekursionsfall. Aber für**
zu arbeiten, Sie haben die einstellenrecursion=True
Schalter, btw.Es gibt viel Verwirrung zu diesem Thema. Lassen Sie mich sehen, ob ich es klären kann (Python 3.7):
glob.glob('*.txt') :
stimmt mit allen Dateien überein, die im aktuellen Verzeichnis mit '.txt' endenglob.glob('*/*.txt') :
gleich wie 1glob.glob('**/*.txt') :
stimmt mit allen Dateien überein, die mit '.txt' enden, nur in den unmittelbaren Unterverzeichnissen , jedoch nicht im aktuellen Verzeichnisglob.glob('*.txt',recursive=True) :
gleich wie 1glob.glob('*/*.txt',recursive=True) :
wie 3glob.glob('**/*.txt',recursive=True):
stimmt mit allen Dateien überein, die im aktuellen Verzeichnis und in allen Unterverzeichnissen mit '.txt' endenEs ist also am besten, immer anzugeben
recursive=True.
quelle
Das glob2- Paket unterstützt Platzhalter und ist relativ schnell
Auf meinem Laptop dauert es ungefähr 2 Sekunden, bis > 60.000 Dateipfade übereinstimmen .
quelle
Sie können Formic mit Python 2.6 verwenden
Offenlegung - Ich bin der Autor dieses Pakets.
quelle
Hier ist eine angepasste Version, die
glob.glob
ähnliche Funktionen ohne Verwendung ermöglichtglob2
.Wenn Sie also die folgende Verzeichnisstruktur haben
Sie können so etwas tun
Ziemlich genau die
fnmatch
Musterübereinstimmung für den gesamten Dateinamen selbst und nicht nur für den Dateinamen.quelle
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Funktioniert nicht in allen Fällen, verwenden Sie stattdessen glob2
quelle
Wenn Sie das glob2-Paket installieren können ...
Alle Dateinamen und Ordner:
quelle
Wenn Sie Python 3.4+ ausführen, können Sie das
pathlib
Modul verwenden. DiePath.glob()
Methode unterstützt das**
Muster, dh "dieses Verzeichnis und alle Unterverzeichnisse rekursiv". Es gibt einen Generator zurück, derPath
Objekte für alle übereinstimmenden Dateien liefert .quelle
Wie von Martijn hervorgehoben, kann glob dies nur über den
**
in Python 3.5 eingeführten Operator tun . Da das OP explizit nach dem Glob-Modul gefragt hat, wird im Folgenden ein verzögerter Evaluierungsiterator zurückgegeben, der sich ähnlich verhältBeachten Sie, dass Sie
configfiles
bei diesem Ansatz jedoch nur einmal iterieren können . Wenn Sie eine echte Liste von Konfigurationsdateien benötigen, die in mehreren Vorgängen verwendet werden können, müssen Sie diese explizit mithilfe von erstellenlist(configfiles)
.quelle
Der Befehl
rglob
führt eine unendliche Rekursion auf der tiefsten Unterebene Ihrer Verzeichnisstruktur durch. Wenn Sie nur eine Ebene tief möchten, verwenden Sie diese jedoch nicht.Mir ist klar, dass das OP über die Verwendung von glob.glob sprach. Ich glaube jedoch, dass dies die Absicht beantwortet, alle Unterordner rekursiv zu durchsuchen.
Die
rglob
Funktion führte kürzlich zu einer 100-fachen Geschwindigkeitssteigerung für einen Datenverarbeitungsalgorithmus, der die Ordnerstruktur als feste Annahme für die Reihenfolge des Datenlesens verwendete. Mit konntenrglob
wir jedoch alle Dateien in oder unter einem bestimmten übergeordneten Verzeichnis einmal scannen, ihre Namen in einer Liste (über eine Million Dateien) speichern und dann anhand dieser Liste bestimmen, welche Dateien wir zu einem beliebigen Zeitpunkt öffnen mussten Zeigen Sie in der Zukunft nur auf der Grundlage der Dateinamenskonventionen im Vergleich zu dem Ordner, in dem sie sich befanden.quelle