Автор оригинала: Doug Hellmann.
Цель:
Используйте правила оболочки Unix, чтобы найти имена файлов, соответствующие шаблону.
Несмотря на то, что API glob
невелик, модуль обладает большой мощностью. Это полезно в любой ситуации, когда программе нужно искать в файловой системе список файлов с именами, соответствующими шаблону. Чтобы создать список имен файлов, у всех которых есть определенное расширение, префикс или любая общая строка в середине, используйте glob
вместо написания специального кода для сканирования содержимого каталога.
Правила шаблона для glob
не совпадают с регулярными выражениями, используемыми модулем re. Вместо этого они следуют стандартным правилам расширения пути Unix. Для реализации двух разных подстановочных знаков и диапазонов символов используется всего несколько специальных символов. Правила шаблона применяются к сегментам имени файла (остановка на разделителе пути, /
). Пути в шаблоне могут быть относительными или абсолютными. Имена переменных оболочки и тильда ( ~
) не раскрываются.
Пример данных
Примеры в этом разделе предполагают, что в текущем рабочем каталоге присутствуют следующие тестовые файлы.
$ python3 glob_maketestdata.py dir dir/file.txt dir/file1.txt dir/file2.txt dir/filea.txt dir/fileb.txt dir/file?.txt dir/file*.txt dir/file[.txt dir/subdir dir/subdir/subfile.txt
Если эти файлы не существуют, используйте glob_maketestdata.py
в примере кода, чтобы создать их, прежде чем запускать следующие примеры.
Подстановочные знаки
Звездочка ( *
) соответствует нулю или большему количеству символов в сегменте имени. Например, dir/*
.
glob_asterisk.py
import glob for name in sorted(glob.glob('dir/*')): print(name)
Шаблон соответствует каждому имени пути (файлу или каталогу) в каталоге dir, без дальнейшего повторного перехода в подкаталоги. Данные, возвращаемые функцией glob ()
, не сортируются, поэтому приведенные здесь примеры сортируют их, чтобы упростить изучение результатов.
$ python3 glob_asterisk.py dir/file*.txt dir/file.txt dir/file1.txt dir/file2.txt dir/file?.txt dir/file[.txt dir/filea.txt dir/fileb.txt dir/subdir
Чтобы перечислить файлы в подкаталоге, подкаталог должен быть включен в шаблон.
glob_subdir.py
import glob print('Named explicitly:') for name in sorted(glob.glob('dir/subdir/*')): print(' {}'.format(name)) print('Named with wildcard:') for name in sorted(glob.glob('dir/*/*')): print(' {}'.format(name))
В первом показанном ранее случае имя подкаталога указывается явно, а во втором случае для поиска каталога используется подстановочный знак.
$ python3 glob_subdir.py Named explicitly: dir/subdir/subfile.txt Named with wildcard: dir/subdir/subfile.txt
В этом случае результаты такие же. Если бы существовал другой подкаталог, подстановочный знак соответствовал бы обоим подкаталогам и включал бы имена файлов из обоих.
Подстановочный знак из одного символа
Знак вопроса (?
) – еще один подстановочный знак. Он соответствует любому одиночному символу в этой позиции в имени.
glob_question.py
import glob for name in sorted(glob.glob('dir/file?.txt')): print(name)
Предыдущий пример соответствует всем именам файлов, которые начинаются с file
, содержат еще один символ любого типа, а затем заканчиваются .txt
.
$ python3 glob_question.py dir/file*.txt dir/file1.txt dir/file2.txt dir/file?.txt dir/file[.txt dir/filea.txt dir/fileb.txt
Диапазоны символов
Используйте диапазон символов ( [a-z]
) вместо вопросительного знака, чтобы соответствовать одному из нескольких символов. В этом примере выполняется поиск всех файлов с цифрой в имени перед расширением.
glob_charrange.py
import glob for name in sorted(glob.glob('dir/*[0-9].*')): print(name)
Диапазон символов [0-9]
соответствует любой отдельной цифре. Диапазон упорядочен на основе кода символа для каждой буквы/цифры, а тире указывает на непрерывный диапазон последовательных символов. То же значение диапазона можно записать как [0123456789]
.
$ python3 glob_charrange.py dir/file1.txt dir/file2.txt
Экранирование мета-символов
Иногда необходимо искать файлы с именами, содержащими специальные метасимволы, которые glob
использует для своих шаблонов. Функция escape ()
создает подходящий шаблон со специальными символами, «экранированными», поэтому они не раскрываются или не интерпретируются как специальные с помощью glob
.
glob_escape.py
import glob specials '?*[' for char in specials: pattern 'dir/*' + glob.escape(char) + '.txt' print('Searching for: {!r}'.format(pattern)) for name in sorted(glob.glob(pattern)): print(name) print()
Каждый специальный символ экранируется путем создания диапазона символов, содержащего одну запись.
$ python3 glob_escape.py Searching for: 'dir/*[?].txt' dir/file?.txt Searching for: 'dir/*[*].txt' dir/file*.txt Searching for: 'dir/*[[].txt' dir/file[.txt
Смотрите также
- стандартная библиотека документации для glob
- Нотация сопоставления с образцом – объяснение подстановки из спецификации языка команд оболочки Open Group.
- fnmatch – реализация сопоставления имен файлов.
- Заметки о переносе Python 2 на 3 для glob