Сообщить об ошибке.

Функция glob() модуля glob в Python

Рекурсивно отобрать файлы по шаблону в стиле Unix

Синтаксис:

import csv

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

Параметры:

  • pathname - путь к каталогу файловой системы,
  • root_dir=None - путь, действует так же, как изменение текущего каталога. Если задан, то pathname должен быть указан относительно root_dir.
  • dir_fd=None - путь относительно дескриптора каталога.
  • recursive=False - просмотр файлов в подкаталогах.

Возвращаемое значение:

Описание:

Функция glob() модуля glob возвращает список имен путей, которые находятся в каталоге pathname, который должен быть строкой, содержащей спецификацию пути (подстановочные wildcard-выражения).

Функция iglob() возвращает итератор, который выдает те же значения, что и функция glob(), только не сохраняет все пути в оперативной памяти одновременно.

Имя пути pathname может быть абсолютным, например /usr/src/Python-1.5/Makefile или относительным, например ../../Tools/*/*.gif и может содержать символы подстановки в стиле оболочки Unix:

  • * - любые символы;
  • ? - любой единичный символ;
  • [seq] - соответствует любому символу в последовательности seq. Например [1-6] - соответствует 1,2,3,4,5,6;
  • [!seq] - соответствует любому символу, не входящему в последовательность seq.

Битые символические ссылки включаются в итоговый результат. Сортировка результатов зависит от файловой системы.

Если задан аргумент root_dir (доступно с версии python 3.10), то это должен быть объект, похожий на путь, указывающий корневой каталог для поиска. На функцию glob() он действует так же, как изменение текущего каталога перед его вызовом. Если pathname является относительным, то результат будет содержать пути относительно root_dir.

Эта функция может поддерживать пути относительно дескрипторов каталогов с параметром dir_fd (доступно с версии python 3.10).

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

Вызывает событие аудита glob.glob с аргументами pathname, recursive.

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

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

Дополнительно смотрите:

  • os.listdir() - список файлов в директории/каталоге,
  • os.scandir() - информация о всех файлах в каталоге/директории,
  • os.walk() - рекурсивный обход каталога как в глубину, так и из глубины,
  • pathlib.Path.glob() - отбор файлов из каталога/директории по шаблону.

Примеры практического применения glob.glob().

Общие примеры использования.

Звездочка '*' соответствует нулю или более символов в сегменте имени. Например dir/*.

>>> import glob
>>> for py in glob.glob("dir/*"):
...    print(py)
...
# dir
# dir/file.txt
# dir/file1.txt
# dir/file2.txt
# dir/filea.txt
# dir/fileb.txt
# dir/file?.txt
# dir/file*.txt
# dir/subdir

>>> glob.glob('dir/subdir/*')
# ['dir/subdir/file3.txt', 'dir/subdir/file4.txt']
>>> sorted(glob.glob('dir/*/*')
# ['dir/subdir/file3.txt', 'dir/subdir/file4.txt']

Знак вопроса '?' - это один символ подстановки. Что соответствует любому отдельному символу в этой позиции в имени. В примере ниже шаблон 'dir/file?.txt' соответствует всем именам файлов, которые начинаются с file, имеют еще один символ любого типа, а затем заканчиваются на .txt.

import glob

for name in sorted(glob.glob('dir/file?.txt')):
    print(name)

# dir/file1.txt
# dir/file2.txt
# dir/filea.txt
# dir/fileb.txt
# dir/file?.txt
# dir/file*.txt

Используйте диапазон символов [a-z] вместо знака вопроса, чтобы соответствовать одному из нескольких символов. Этот пример находит все файлы с цифрой в имени перед расширением.

import glob
for name in sorted(glob.glob('dir/*[0-9].*')):
    print(name)

# dir/file1.txt
# dir/file2.txt

Рекурсивный поиск файлов, шаблон **.

Двойной символ звездочки ** в сочетании с аргументом recursive=True разрешает поиск файлов по шаблону во всех подкаталогах указанного пути файловой системы.

import glob
for name in sorted(glob.glob('dir/**/*[0-9].txt', recursive=True)):
    print(name)

# dir/file1.txt
# dir/file2.txt
# dir/subdir/file3.txt
# dir/subdir/file4.txt

Поиск файлов по шаблону и сортировкой по дате.

Алгоритм нужного поведения функции glob.glob() будет следующий:

  1. Ищем файлы функции glob.glob() как показано выше.
  2. В результате поиска получаем список найденных файлов.
  3. Полученный список сортируем родным методом list.sort(key=None).
  4. В качестве ключа key указываем функцию извлечения даты файла os.path.getmtime().
  5. Используем отсортированный по дате список файлов по назначению.
>>> import glob
>>> import os
# ищем файлы как показано выше
>>> files = glob.glob("*cycle*.log")

# далее полученный список файлов сортируем 
# используя в качестве ключа функцию 
# получения даты файла os.path.getmtime()
>>> files.sort(key=os.path.getmtime)

# Используем отсортированный по дате 
# список файлов по назначению
>>> print("\n".join(files))