glob — Pfadnamensexpansion nach Unix-Art¶
Quellcode: Lib/glob.py
Das Modul glob findet Pfadnamen anhand von Vergleichsregeln, die denen der Unix-Shell ähneln. Eine Tilde-Expansion findet nicht statt, *, ? und mit [] ausgedrückte Zeichenbereiche werden aber richtig erfasst. Das geschieht, indem die Funktionen os.scandir() und fnmatch.fnmatch() zusammenwirken, und nicht dadurch, dass wirklich eine Untershell aufgerufen wird.
Bemerkung
Die Pfadnamen werden in keiner bestimmten Reihenfolge zurückgegeben. Brauchst du eine bestimmte Reihenfolge, sortiere die Ergebnisse.
Standardmäßig werden Dateien, die mit einem Punkt (.) beginnen, nur von Mustern erfasst, die ebenfalls mit einem Punkt beginnen — anders als bei fnmatch.fnmatch() oder pathlib.Path.glob(). Für die Expansion von Tilde und Shell-Variablen verwende os.path.expanduser() und os.path.expandvars().
Für einen wortwörtlichen Vergleich setze die Metazeichen in eckige Klammern. '[?]' passt zum Beispiel auf das Zeichen '?'.
Das Modul glob legt die folgenden Funktionen fest:
- glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)¶
Gibt eine möglicherweise leere Liste von Pfadnamen zurück, die auf pathname passen. pathname muss eine Zeichenkette mit einer Pfadangabe sein. pathname darf entweder absolut sein (etwa
/usr/src/Python-1.5/Makefile) oder relativ (etwa../../Tools/*/*.gif) und darf Platzhalter nach Shell-Art enthalten. Kaputte symbolische Verknüpfungen sind in den Ergebnissen enthalten (wie in der Shell). Ob die Ergebnisse sortiert sind, hängt vom Dateisystem ab. Wird eine Datei, die die Bedingungen erfüllt, während des Aufrufs dieser Funktion entfernt oder hinzugefügt, ist nicht festgelegt, ob ein Pfadname für diese Datei enthalten ist.Ist root_dir nicht
None, sollte es ein pfadartiges Objekt sein, das das Wurzelverzeichnis für die Suche angibt. Es hat aufglob()dieselbe Wirkung, wie vor dem Aufruf das aktuelle Verzeichnis zu wechseln. Ist pathname relativ, enthält das Ergebnis Pfade relativ zu root_dir.Diese Funktion kann Pfade relativ zu Verzeichnisdeskriptoren über den Parameter dir_fd unterstützen.
Ist recursive wahr, passt das Muster „
**“ auf beliebige Dateien und null oder mehr Verzeichnisse, Unterverzeichnisse und symbolische Verknüpfungen auf Verzeichnisse. Folgt dem Muster einos.sepoderos.altsep, werden Dateien nicht erfasst.Ist include_hidden wahr, können Platzhalter auch Pfadabschnitte erfassen, die mit einem Punkt (
.) beginnen.Löst ein Auditing-Ereignis
glob.globmit den Argumentenpathname,recursiveaus.Löst ein Auditing-Ereignis
glob.glob/2mit den Argumentenpathname,recursive,root_dir,dir_fdaus.Bemerkung
Das Muster „
**“ in großen Verzeichnisbäumen zu verwenden, kann unverhältnismäßig viel Zeit kosten.Bemerkung
Diese Funktion gibt möglicherweise doppelte Pfadnamen zurück, wenn pathname mehrere Muster „
**“ enthält und recursive wahr ist.Bemerkung
Alle
OSError-Ausnahmen, die beim Durchsuchen des Dateisystems ausgelöst werden, werden unterdrückt. Dazu gehörtPermissionErrorbeim Zugriff auf Verzeichnisse ohne Leserecht.Geändert in Version 3.5: Rekursives Globben mit „
**“ wird unterstützt.Geändert in Version 3.10: Die Parameter root_dir und dir_fd wurden ergänzt.
Geändert in Version 3.11: Der Parameter include_hidden wurde ergänzt.
- glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)¶
Gibt einen Iterator zurück, der dieselben Werte liefert wie
glob(), ohne sie alle gleichzeitig vorzuhalten.Löst ein Auditing-Ereignis
glob.globmit den Argumentenpathname,recursiveaus.Löst ein Auditing-Ereignis
glob.glob/2mit den Argumentenpathname,recursive,root_dir,dir_fdaus.Bemerkung
Diese Funktion gibt möglicherweise doppelte Pfadnamen zurück, wenn pathname mehrere Muster „
**“ enthält und recursive wahr ist.Bemerkung
Alle
OSError-Ausnahmen, die beim Durchsuchen des Dateisystems ausgelöst werden, werden unterdrückt. Dazu gehörtPermissionErrorbeim Zugriff auf Verzeichnisse ohne Leserecht.Geändert in Version 3.5: Rekursives Globben mit „
**“ wird unterstützt.Geändert in Version 3.10: Die Parameter root_dir und dir_fd wurden ergänzt.
Geändert in Version 3.11: Der Parameter include_hidden wurde ergänzt.
- glob.escape(pathname)¶
Maskiert alle besonderen Zeichen (
'?','*'und'['). Das ist nützlich, wenn du eine beliebige wortwörtliche Zeichenkette abgleichen willst, die besondere Zeichen enthalten kann. Besondere Zeichen in Laufwerks- und UNC-Freigabepunkten werden nicht maskiert, unter Windows gibtescape('//?/c:/Quo vadis?.txt')zum Beispiel'//?/c:/Quo vadis[?].txt'zurück.Added in version 3.4.
- glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)¶
Wandelt die angegebene Pfadangabe in einen regulären Ausdruck um, zur Verwendung mit
re.prefixmatch(). Die Pfadangabe darf Platzhalter nach Shell-Art enthalten.Zum Beispiel:
>>> import glob, re >>> >>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True) >>> regex '(?s:(?:.+/)?[^/]*\\.txt)\\z' >>> reobj = re.compile(regex) >>> reobj.prefixmatch('foo/bar/baz.txt') <re.Match object; span=(0, 15), match='foo/bar/baz.txt'>
Pfadtrennzeichen und Pfadabschnitte sind für diese Funktion bedeutsam, anders als bei
fnmatch.translate(). Standardmäßig erfassen Platzhalter keine Pfadtrennzeichen, und Musterabschnitte mit*erfassen genau einen Pfadabschnitt.Ist recursive wahr, erfasst der Musterabschnitt „
**“ beliebig viele Pfadabschnitte.Ist include_hidden wahr, können Platzhalter auch Pfadabschnitte erfassen, die mit einem Punkt (
.) beginnen.Dem Argument seps lässt sich eine Sequenz von Pfadtrennzeichen übergeben. Wird sie nicht angegeben, werden
os.sepundaltsep(sofern verfügbar) verwendet.Siehe auch
Die Methoden
pathlib.PurePath.full_match()undpathlib.Path.glob(), die diese Funktion für Mustervergleich und Globben aufrufen.Added in version 3.13.
Beispiele¶
Stell dir ein Verzeichnis mit den folgenden Dateien vor: 1.gif, 2.txt, card.gif und ein Unterverzeichnis sub, das nur die Datei 3.txt enthält. glob() liefert dann die folgenden Ergebnisse. Beachte, wie führende Bestandteile des Pfades erhalten bleiben.
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
Enthält das Verzeichnis Dateien, die mit . beginnen, werden sie standardmäßig nicht erfasst. Stell dir zum Beispiel ein Verzeichnis vor, das card.gif und .card.gif enthält:
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
Siehe auch
Das Modul fnmatch bietet die Expansion von Dateinamen (nicht von Pfaden) nach Shell-Art.
Siehe auch
Das Modul pathlib bietet Pfadobjekte auf höherer Ebene.