Найти тему
programmer's notes (python and more)

Программирование на языке Python. Модуль glob поиска файлов

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Модуль glob и поиск в файловой системе

Модуль glob это еще один способ получения списка файлов файловой системы, в том числе и с использованием рекурсивного поиска.

Поиск осуществляется методом glob. Можно использовать шаблоны символы (метасимволы) * - любая последовательность символов, ? - любой символ, диапазоны символов, например [0-9], или так [!0-9] для всех символов, не входящих в указанный диапазон. Чтобы при поиске метасимвол понимался буквально используются квадратные скобки. Например [?] это просто знак вопроса. В Unix-системах имена скрытых файлов начинаются с точки. Чтобы функция glob извлекала такие файлы в шаблоне нужно непосредственно указывать эту точку. Знак '~' используемый для обозначения домашнего каталога не интерпретируется функцией glob, поэтому нужно предварительно заменить тильду реальным путём, например, с помощью os.path.expanduser().

Пример 1. Получить список скрытых файлов в указанном каталоге

#!/usr/bin/python3
import glob
ls = glob.glob('/home/pirogov/.*')
print(ls)

Результат выполнения

['/home/pirogov/.rpmmacros', '/home/pirogov/.ddd', '/home/pirogov/.apt', '/home/pirogov/.yandex', '/home/pirogov/.Xauthority', '/home/pirogov/.bashrc', '/home/pirogov/.thunderbird', '/home/pirogov/.ICEauthority', '/home/pirogov/.wingpersonal8', '/home/pirogov/.gnupg', '/home/pirogov/.dmrc', '/home/pirogov/.xsession-errors.old', '/home/pirogov/.bash_logout', '/home/pirogov/.gnome', '/home/pirogov/.designer', '/home/pirogov/.java', '/home/pirogov/.ssh', '/home/pirogov/.lpoptions', '/home/pirogov/.local', '/home/pirogov/.xsession.d', '/home/pirogov/.var', '/home/pirogov/.mozilla', '/home/pirogov/.zoom', '/home/pirogov/.bash_history', '/home/pirogov/.config', '/home/pirogov/.xsession-errors:0', '/home/pirogov/.mplayer', '/home/pirogov/.mutt', '/home/pirogov/.dia', '/home/pirogov/.pki', '/home/pirogov/.cache', '/home/pirogov/.xsession-errors', '/home/pirogov/.gtkrc-2.0', '/home/pirogov/.xprofile', '/home/pirogov/.viminfo', '/home/pirogov/.bash_profile']

Как видим результат получается в виду списка с произвольным следованием элементов.

Подчеркнём лишний раз, что скрытые файлы, у которых имя начинается с точки, не попадают в обычный шаблон '*', для них требуется шаблон '.*'.

Функция glob имеет следующие параметры

  • pathname — путь с указанием шаблонов поиска;
  • root_dir=None — действует как изменение текущего каталога (на время поиска), параметр действует с версии Python 3.10;
  • dir_fd=None — путь относительно дескриптора каталога, параметр действует с версии Python 3.10;
  • recursive=False — рекурсивный просмотр.

Есть также метод iglob, который полностью идентичен методы glob, но возвращает итератор.

Специальный шаблон '**' показывает, что нужно искать в подкаталогах указанного каталога.

Пример 2. Поиск в подкаталогах текущего каталога

#!/usr/bin/python3
import glob
ls = glob.glob('./**/*')
print(ls)

Результат выполнения

['./ty/qw', './ty/Задачи (ввод-вывод).pdf', './rt/программисты шутят.odt']

Т.е. программа как бы делает шаг в сторону каталогов, которые есть в текущем и просматривает их. При необходимости рекурсивного поиска указываем так

ls = glob.glob('./**/*', recursive=True)

получаем для моего случая

['./2.py', './1.py', './ty', './3.py', './rt', './ty/qw', './ty/Задачи (ввод-вывод).pdf', './ty/qw/1.py', './rt/программисты шутят.odt']

Как видим выдаётся всё дерево каталогов, начиная с текущего.

Модуль glob имеет также специальную функцию escape(), которая экранирует все специальные символы.

Например

print(glob.escape('/hoime/*.???a'))

Результат

/home/[*].[?][?][?]a

Ну вот пока всё. Пишите свои предложения и замечания и занимайтесь программированием, хотя бы для поддержания уровня интеллекта.

В темноте я не смог найти ни одного файла
В темноте я не смог найти ни одного файла