Модуль glob
находит все пути, соответствующие указанному шаблону, в соответствии с правилами, используемыми оболочкой Unix. Результаты возвращаются в произвольном порядке.
Расширение переменных пути при указании тильды ~/path
не выполняется, но символы '*'
,'?'
и диапазоны символов, такие как [a-z0-9]
, будут работать правильно. Это делается с помощью согласованных функций os.scandir()
и fnmatch.fnmatch()
, а не путем фактического вызова оболочки.
Обратите внимание, что в отличие от fnmatch.fnmatch()
, модуль glob
рассматривает имена файлов, начинающиеся с точки '.'
, как особые случаи.
~
используйте функцию os.path.expanduser()
и os.path.expandvars()
.[?]
Соответствует символу ?
.Смотрите также модуль pathlib
, который предлагает высокоуровневые объекты пути.
Рассмотрим каталог, содержащий следующие файлы: 1.gif
, 2.txt
, card.gif
и вложенный каталог sub
, который содержит только файл 3.txt
. Функция glob.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']