Сообщить об ошибке.

Определение типа файла без расширения в Python

Определение типа файла без расширения или по его содержимому (если тип указан неверно) можно при помощи стороннего модуля 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'