Определение типа файла без расширения или по его содержимому (если тип указан неверно) можно при помощи стороннего модуля magic
.
Установить модуль magic
можно через менеджер пакетов pip
. Устанавливайте сторонние модули только в виртуальное окружение.
Модуль python-magic - это интерфейс Python для библиотеки ОС идентификации типов файлов libmagic
. Эта библиотека идентифицирует типы файлов, проверяя их заголовки в соответствии с предопределенным списком типов файлов. Функция операционной системы magic()
доступна в командной строке с помощью командного файла Unix.
(myVenv) $ pip install python-magic
Распознавание типа файла по его содержимому происходит следующим образом:
>>> import magic >>> mime = magic.Magic(mime=True) >>> mime.from_file("testdata/test.pf") # 'application/pdf' >>> magic.from_file('iceland.jpg') # 'JPEG image data, JFIF standard 1.01' >>> magic.from_file('iceland.jpg', mime=True) # 'image/jpeg' >>> magic.from_file('greenland.png') # 'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced' >>> magic.from_file('greenland.png', mime=True) # 'image/png'
Если файл большой, то можно прочитать часть файла в буфер. Рекомендуется использовать по крайней мере первые 2048 байт, так как меньше может привести к неправильной идентификации.
>>> import magic # рекомендуется использовать по крайней мере первые 2048 байт, # так как меньше может привести к неправильной идентификации >>> magic.from_buffer(open("testdata/test.pdf").read(2048)) # 'PDF document, version 1.2'
Можно даже распознать формат файла упакованного в архив!
>>> import magic >>> f = magic.Magic(uncompress=True) >>> f.from_file('testdata/test.gz') # 'ASCII text (gzip compressed data, was "test", last modified: # Mon 04 Jan 2021 01:55:22 PM MSK, from Unix)'
Можно также комбинировать параметры флагов.
>>> f = magic.Magic(mime=True, uncompress=True) >>> f.from_file('testdata/test.gz') # 'text/plain'