glob — Расширение шаблона имени пути в стиле Unix

Источник: Lib/glob.py


Модуль glob находит все имена путей, соответствующие заданному шаблону, в соответствии с правилами, используемыми оболочкой Unix, хотя результаты возвращаются в произвольном порядке. Расширение тильды не выполняется, но *, ? и диапазоны символов, выраженные с помощью [], будут правильно сопоставлены. Это достигается за счет совместного использования функций os.scandir() и fnmatch.fnmatch(), а не за счет фактического вызова под-оболочки.

Обратите внимание, что файлы, начинающиеся с точки (.), могут быть сопоставлены только с шаблонами, которые также начинаются с точки, в отличие от fnmatch.fnmatch() или pathlib.Path.glob(). (Для расширения тильды и переменных оболочки используйте os.path.expanduser() и os.path.expandvars()).

Для буквального совпадения оберните метасимволы в скобки. Например, '[?]' соответствует символу '?'.

Модуль glob определяет следующие функции:

glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Возвращает возможно пустой список имен путей, соответствующих pathname, который должен быть строкой, содержащей спецификацию пути. pathname может быть абсолютным (например, /usr/src/Python-1.5/Makefile) или относительным (например, ../../Tools/*/*.gif) и может содержать подстановочные знаки в стиле shell. Разбитые симлинки включаются в результаты (как в оболочке). Сортировка результатов зависит от файловой системы. Если во время вызова этой функции файл, удовлетворяющий условиям, удаляется или добавляется, будет ли включено имя пути к этому файлу, не уточняется.

Если root_dir не является None, то это должно быть path-like object, указывающее корневой каталог для поиска. Это имеет тот же эффект на glob(), что и изменение текущего каталога перед вызовом. Если pathname является относительным, результат будет содержать пути относительно root_dir.

Эта функция может поддерживать paths relative to directory descriptors с параметром dir_fd.

Если значение recursive равно true, шаблон «**» будет соответствовать любым файлам и нулю или более каталогов, подкаталогов и символических ссылок на каталоги. Если за шаблоном следует os.sep или os.altsep, то файлы не будут соответствовать.

Если значение include_hidden равно true, шаблон «**» будет соответствовать скрытым каталогам.

Поднимает auditing event glob.glob с аргументами pathname, recursive.

Поднимает auditing event glob.glob/2 с аргументами pathname, recursive, root_dir, dir_fd.

Примечание

Использование шаблона «**» в больших деревьях каталогов может занимать непомерно много времени.

Примечание

Эта функция может возвращать дублирующиеся имена путей, если pathname содержит несколько шаблонов «**» и значение recursive равно true.

Изменено в версии 3.5: Поддержка рекурсивных глобусов с использованием «**».

Изменено в версии 3.10: Добавлены параметры root_dir и dir_fd.

Изменено в версии 3.11: Добавлен параметр include_hidden.

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Возвращает iterator, который дает те же значения, что и glob(), не сохраняя их все одновременно.

Поднимает auditing event glob.glob с аргументами pathname, recursive.

Поднимает auditing event glob.glob/2 с аргументами pathname, recursive, root_dir, dir_fd.

Примечание

Эта функция может возвращать дублирующиеся имена путей, если pathname содержит несколько шаблонов «**» и значение recursive равно true.

Изменено в версии 3.5: Поддержка рекурсивных глобусов с использованием «**».

Изменено в версии 3.10: Добавлены параметры root_dir и dir_fd.

Изменено в версии 3.11: Добавлен параметр include_hidden.

glob.escape(pathname)

Эскейп всех специальных символов ('?', '*' и '['). Это полезно, если нужно сопоставить произвольную буквенную строку, в которой могут присутствовать специальные символы. Специальные символы в общих точках диска/UNC не экранируются, например, в Windows escape('//?/c:/Quo vadis?.txt') возвращает '//?/c:/Quo vadis[?].txt'.

Added in version 3.4.

glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)

Преобразует заданную спецификацию пути в регулярное выражение для использования с re.match(). Спецификация пути может содержать подстановочные знаки в стиле оболочки.

Например:

>>> import glob, re
>>>
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> regex
'(?s:(?:.+/)?[^/]*\\.txt)\\Z'
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>

В отличие от fnmatch.translate(), разделители и сегменты пути имеют смысл для этой функции. По умолчанию подстановочные знаки не совпадают с разделителями путей, а сегменты шаблона * соответствуют только одному сегменту пути.

Если значение recursive равно true, сегмент шаблона «**» будет соответствовать любому количеству сегментов пути.

Если значение include_hidden равно true, подстановочные знаки могут соответствовать сегментам пути, начинающимся с точки (.).

В аргументе seps может быть указана последовательность разделителей путей. Если она не указана, то используются os.sep и altsep (если есть).

См.также

Методы pathlib.PurePath.full_match() и pathlib.Path.glob(), которые вызывают эту функцию, чтобы реализовать сопоставление шаблонов и globbing.

Added in version 3.13.

Примеры

Рассмотрим каталог, содержащий следующие файлы: 1.gif, 2.txt, card.gif и подкаталог sub, содержащий только файл 3.txt. glob() приведет к следующим результатам. Обратите внимание, что все ведущие компоненты пути сохраняются.

>>> 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/']

Если каталог содержит файлы, начинающиеся с ., они не будут сопоставлены по умолчанию. Например, рассмотрим каталог, содержащий card.gif и .card.gif:

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

См.также

Модуль fnmatch предлагает расширение имени файла (не пути) в стиле оболочки.

См.также

Модуль pathlib предлагает высокоуровневые объекты пути.