Чтобы задействовать этот модуль для управления выбором текстовых файлов в сценариях поиска, написанных нами выше в этой главе, можно просто извлекать и анализировать первый элемент кортежа, возвращаемого для заданного имени файла. Например, все расширения в следующем списке считаются расширениями имен текстовых файлов (кроме расширения «.pyw», которое можно считать особым случаем):
> >> for ext in [‘.txt’, ‘.py’, ‘.pyw’, ‘.html’, ‘.c’, ‘.h’, ‘.xml’]:
… print(ext, mimetypes.guess_type(‘spam’ + ext))
…
.txt (‘text/plain’, None)
.py (‘text/x-python’, None)
.pyw (None, None)
.html (‘text/html’, None)
.c (‘text/plain’, None)
.h (‘text/plain’, None)
.xml (‘text/xml’, None)
Мы можем добавить этот прием в предыдущую реализацию класса SearchVisitor, переопределив метод candidate и заменив список расширений имен файлов, используемый по умолчанию, анализом возвращаемого типа модулем mimetypes — еще одно яркое свидетельство гибкости ООП:
C:\…\PP4E\Tools> python
> >> import mimetypes
> >> from visitor import SearchVisitor # или PP4E.Tools.visitor, если не .
>>>
> >> class SearchMimeVisitor(SearchVisitor):
… def candidate(self, fname):
… contype, encoding = mimetypes.guess_type(fname)
… return (contype and
… contype.split(‘/’)[0] == ‘text’ and
… encoding == None)
…
> >> V = SearchMimeVisitor(‘mimetypes’, trace=0) # ключ поиска
>>> V.run(r’C:\temp\PP3E\Examples’) # корневой каталог
C:\temp\PP3E\Examples\PP3E\extras\LosAlamosAdvancedClass\day1-system\data.txt has mimetypes
C:\temp\PP3E\Examples\PP3E\Internet\Email\mailtools\mailParser.py has mimetypes
C:\temp\PP3E\Examples\PP3E\Internet\Email\mailtools\mailSender.py has mimetypes C:\temp\PP3E\Examples\PP3E\Internet\Ftp\mirror\downloadflat.py has mimetypes C:\temp\PP3E\Examples\PP3E\Internet\Ftp\mirror\downloadflat_modular.py has mimetypes
C:\temp\PP3E\Examples\PP3E\Internet\Ftp\mirror\ftptools.py has mimetypes
C:\temp\PP3E\Examples\PP3E\Internet\Ftp\mirror\uploadflat.py has mimetypes
C:\temp\PP3E\Examples\PP3E\System\Media\playfile.py has mimetypes
>>> V.scount, V.fcount, V.dcount
(8, 1429, 186)
Однако этот прием не обеспечивает абсолютную точность (в случае необходимости придется добавить логику обслуживания таких расширений, как «.pyw», которые не определяются модулем mimetypes) и подходит далеко не для всех клиентов (в некоторых случаях может потребоваться искать только определенные типы текстовых файлов), поэтому данная схема не использовалась в оригинальном классе. Использование и настройку его для ваших собственных нужд мы оставим в качестве самостоятельного упражнения.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011