Термин globbing (глобальный поиск по шаблону) происходит от группового символа *, используемого в шаблонах имен файлов. На компьютерном сленге символ * трактуется, как «glob» (группа символов). Более приземленно, глобальный поиск по шаблону просто означает получение имен всех элементов в каталоге — файлов и подкаталогов, имена которых соответствуют заданному шаблону. В командных оболочках Unix при глобальном поиске шаблоны имен файлов, указанные в командной строке, расширяются до всех совпадающих имен еще перед выполнением команды. В Python можно делать нечто похожее, вызывая встроенную функцию glob.glob, — инструмент, принимающий шаблон имени файла и возвращающий список (не генератор) имен файлов, соответствующих этому шаблону:
>>> import glob
>>> glob.glob(‘*’)
[‘parts’, ‘PP3E’, ‘random.bin’, ‘spam.txt’, ‘temp.bin’, ‘temp.txt’]
>>> glob.glob(‘*.bin’)
[‘random.bin’, ‘temp.bin’]
>>> glob.glob(‘parts’)
[‘parts’]
>>> glob.glob(‘parts/*’)
[‘parts\\part0001’, ‘parts\\part0002’, ‘parts\\part0003’, ‘parts\\part0004’]
>>> glob.glob(‘parts\part*’)
[‘parts\\part0001’, ‘parts\\part0002’, ‘parts\\part0003’, ‘parts\\part0004’]
Для определения шаблонов в функции glob используется обычный синтаксис шаблонов имен файлов, используемый в командных оболочках: ? означает один любой символ, * означает любое число символов, а [] означает множество символов, доступных для выбора.[XI] Если поиск нужно осуществлять в каталоге, отличном от текущего рабочего каталога, в шаблон нужно включить путь к каталогу. Кроме того, модуль принимает разделители имен каталогов в стиле Unix или DOS (/ или \). Эта функция реализована так, что не вызывает команды оболочки (она использует функцию os.listdir, описываемую в следующем разделе) и потому должна выполняться быстрее и лучше переноситься на все платформы Python, чем показанные выше приемы с применением функции os.popen.
Вообще функция glob несколько мощнее, чем здесь описано. Получение списка файлов в каталоге является лишь одной из ее возможностей поиска по шаблону. Например, ее можно использовать для получения списка имен из нескольких каталогов, так как каждый уровень в передаваемом пути к каталогу также можно определить в виде шаблона:
>>> for path in glob.glob(r’PP3E\Examples\PP3E\*\s*.py’): print(path)
…
PP3E\Examples\PP3E\Lang\summer-alt.py
PP3E\Examples\PP3E\Lang\summer.py
PP3E\Examples\PP3E\PyTools\search_all.py
Здесь мы получили список имен файлов, соответствующих шаблону s*.py, из двух разных каталогов. Так как в качестве имени предшествующего каталога был использован групповой символ *, Python перебрал все возможные пути к файлам. Запуская команды оболочки с помощью функции os.popen, такого же результата можно добиться, только если подобная возможность поддерживается самой командной оболочкой или командой вывода списка файлов.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011