Рубрики
Без рубрики

glob – сопоставление имени файла с шаблоном

Автор оригинала: 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

Смотрите также