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 auf glob() 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 ein os.sep oder os.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.glob mit den Argumenten pathname, recursive aus.

Löst ein Auditing-Ereignis glob.glob/2 mit den Argumenten pathname, recursive, root_dir, dir_fd aus.

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ört PermissionError beim 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.glob mit den Argumenten pathname, recursive aus.

Löst ein Auditing-Ereignis glob.glob/2 mit den Argumenten pathname, recursive, root_dir, dir_fd aus.

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ört PermissionError beim 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 gibt escape('//?/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.sep und altsep (sofern verfügbar) verwendet.

Siehe auch

Die Methoden pathlib.PurePath.full_match() und pathlib.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.