Доброго времени суток, читатели, зрители моего канала 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
Ну вот пока всё. Пишите свои предложения и замечания и занимайтесь программированием, хотя бы для поддержания уровня интеллекта.