glob
— Расширение шаблона имени пути в стиле Unix¶
Исходный код: Lib/glob.py.
Модуль glob
находит все имена путей, соответствующие заданному шаблону, в соответствии с правилами, используемыми оболочкой Unix, хотя результаты возвращаются в произвольном порядке. Расширение тильды не выполняется, но *
, ?
и диапазоны символов, выраженные с помощью []
, будут правильно сопоставлены. Это происходит за счет совместного использования функций os.scandir()
и fnmatch.fnmatch()
, а не за счет фактического вызова вложенной оболочки.
Обратите внимание, что файлы, начинающиеся с точки (.
), могут быть сопоставлены только с шаблонами, которые также начинаются с точки, в отличие от fnmatch.fnmatch()
или pathlib.Path.glob()
. (Для тильды и расширения переменных оболочки используйте os.path.expanduser()
и os.path.expandvars()
).
Для буквального соответствия оберните метасимволы в скобки. Например, '[?]'
соответствует символу '?'
.
См.также
Модуль pathlib
предлагает высокоуровневые объекты пути.
-
glob.
glob
(pathname, *, root_dir=None, dir_fd=None, recursive=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 истинно, то шаблон «
**
» будет соответствовать любым файлам и нулю или более каталогам, подкаталогам и символическим ссылкам на каталоги. Если за шаблоном следуетos.sep
илиos.altsep
, то файлы не будут соответствовать.Вызывает auditing event
glob.glob
с аргументамиpathname
,recursive
.Вызывает auditing event
glob.glob/2
с аргументамиpathname
,recursive
,root_dir
,dir_fd
.Примечание
Использование шаблона «
**
» в больших деревьях каталогов может занимать непомерно много времени.Изменено в версии 3.5: Поддержка рекурсивных глобусов с использованием «
**
».Изменено в версии 3.10: Добавлены параметры root_dir и dir_fd.
-
glob.
iglob
(pathname, *, root_dir=None, dir_fd=None, recursive=False)¶ Возвращает iterator, который дает те же значения, что и
glob()
, не храня их все одновременно.Вызывает auditing event
glob.glob
с аргументамиpathname
,recursive
.Вызывает auditing event
glob.glob/2
с аргументамиpathname
,recursive
,root_dir
,dir_fd
.Изменено в версии 3.5: Поддержка рекурсивных глобусов с использованием «
**
».Изменено в версии 3.10: Добавлены параметры root_dir и dir_fd.
-
glob.
escape
(pathname)¶ Экранирование всех специальных символов (
'?'
,'*'
и'['
). Это полезно, если вы хотите подобрать произвольную литеральную строку, в которой могут присутствовать специальные символы. Специальные символы в долях диска/UNC не экранируются, например, в Windowsescape('//?/c:/Quo vadis?.txt')
возвращает'//?/c:/Quo vadis[?].txt'
.Добавлено в версии 3.4.
Например, рассмотрим каталог, содержащий следующие файлы: 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
Расширение имени файла (не пути) в стиле Shell