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

fnmatch – соответствие шаблону глобуса в стиле Unix

Автор оригинала: Doug Hellmann.

Цель:

Обработка сравнения имен файлов в стиле Unix.

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

Простое соответствие

fnmatch () сравнивает отдельное имя файла с шаблоном и возвращает логическое значение, указывающее, совпадают они или нет. При сравнении учитывается регистр, если операционная система использует файловую систему с учетом регистра.

fnmatch_fnmatch.py

import fnmatch
import os

pattern  'fnmatch_*.py'
print('Pattern :', pattern)
print()

files  os.listdir('.')
for name in sorted(files):
    print('Filename: {:<25} {}'.format(
        name, fnmatch.fnmatch(name, pattern)))

В этом примере шаблон соответствует всем файлам, начинающимся с 'fnmatch_' и заканчивающимся '.py' .

$ python3 fnmatch_fnmatch.py

Pattern : fnmatch_*.py

Filename: fnmatch_filter.py         True
Filename: fnmatch_fnmatch.py        True
Filename: fnmatch_fnmatchcase.py    True
Filename: fnmatch_translate.py      True
Filename: index.rst                 False

Для принудительного сравнения с учетом регистра, независимо от файловой системы и настроек операционной системы, используйте fnmatchcase () .

fnmatch_fnmatchcase.py

import fnmatch
import os

pattern  'FNMATCH_*.PY'
print('Pattern :', pattern)
print()

files  os.listdir('.')

for name in sorted(files):
    print('Filename: {:<25} {}'.format(
        name, fnmatch.fnmatchcase(name, pattern)))

Поскольку в системе OS X, используемой для тестирования этой программы, используется файловая система с учетом регистра, ни один файл не соответствует измененному шаблону.

$ python3 fnmatch_fnmatchcase.py

Pattern : FNMATCH_*.PY

Filename: fnmatch_filter.py         False
Filename: fnmatch_fnmatch.py        False
Filename: fnmatch_fnmatchcase.py    False
Filename: fnmatch_translate.py      False
Filename: index.rst                 False

Фильтрация

Чтобы проверить последовательность имен файлов, используйте filter () , который возвращает список имен, соответствующих аргументу шаблона.

fnmatch_filter.py

import fnmatch
import os
import pprint

pattern  'fnmatch_*.py'
print('Pattern :', pattern)

files  list(sorted(os.listdir('.')))

print('\nFiles   :')
pprint.pprint(files)

print('\nMatches :')
pprint.pprint(fnmatch.filter(files, pattern))

В этом примере filter () возвращает список имен исходных файлов примеров, связанных с этим разделом.

$ python3 fnmatch_filter.py

Pattern : fnmatch_*.py

Files   :
['fnmatch_filter.py',
 'fnmatch_fnmatch.py',
 'fnmatch_fnmatchcase.py',
 'fnmatch_translate.py',
 'index.rst']

Matches :
['fnmatch_filter.py',
 'fnmatch_fnmatch.py',
 'fnmatch_fnmatchcase.py',
 'fnmatch_translate.py']

Перевод шаблонов

Внутренне fnmatch преобразует шаблон глобуса в регулярное выражение и использует модуль re для сравнения имени и шаблона. Функция translate () – это общедоступный API для преобразования шаблонов глобусов в регулярные выражения.

fnmatch_translate.py

import fnmatch

pattern  'fnmatch_*.py'
print('Pattern :', pattern)
print('Regex   :', fnmatch.translate(pattern))

Некоторые символы экранированы, чтобы получилось правильное выражение.

$ python3 fnmatch_translate.py

Pattern : fnmatch_*.py
Regex   : (?s:fnmatch_.*\.py)\Z

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