Автор оригинала: 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
Смотрите также
- стандартная библиотека документации для fnmatch
- glob – модуль glob объединяет соответствие
fnmatch
сos.listdir ()
для создания списков файлов и каталогов, соответствующих шаблонам. - re – соответствие шаблону регулярного выражения.