Как найти MIME-тип файла в Python? - PullRequest
165 голосов
/ 04 сентября 2008

Допустим, вы хотите сохранить группу файлов где-нибудь, например, в BLOB. Допустим, вы хотите выложить эти файлы через веб-страницу и клиент автоматически открывает нужное приложение / средство просмотра.

Предположение: браузер выясняет, какое приложение / средство просмотра использовать заголовком mime-type (content-type?) В ответе HTTP.

Исходя из этого предположения, помимо байтов файла, вы также хотите сохранить тип MIME.

Как бы вы нашли MIME-тип файла? Я в настоящее время на Mac, но это также должно работать на Windows.

Добавляет ли браузер эту информацию при публикации файла на веб-странице?

Есть ли аккуратная библиотека Python для поиска этой информации? Веб-сервис или (что еще лучше) загружаемая база данных?

Ответы [ 17 ]

185 голосов
/ 02 мая 2010

Метод python-magic, предложенный toivotuo, устарел. Текущий магистраль Python-magic находится на Github и, основываясь на этом файле readme, обнаружение MIME-типа выполняется следующим образом.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
80 голосов
/ 04 сентября 2008

Модуль mimetypes в стандартной библиотеке будет определять / угадывать MIME-тип по расширению файла.

Если пользователи загружают файлы, сообщение HTTP будет содержать MIME-тип файла вместе с данными. Например, Django делает эти данные доступными в качестве атрибута объекта UploadedFile .

43 голосов
/ 25 января 2010

Более надежным способом использования библиотеки mimetypes было бы использование пакета python-magic.

import magic
m = magic.open(magic.MAGIC_MIME)
m.load()
m.file("/tmp/document.pdf")

Это было бы эквивалентно использованию файла (1).

В Django можно также убедиться, что тип MIME соответствует типу UploadedFile.content_type.

25 голосов
/ 13 февраля 2014

Это кажется очень легким

>>> from mimetypes import MimeTypes
>>> import urllib 
>>> mime = MimeTypes()
>>> url = urllib.pathname2url('Upload.xml')
>>> mime_type = mime.guess_type(url)
>>> print mime_type
('application/xml', None)

Пожалуйста, обратитесь Старый пост

10 голосов
/ 06 сентября 2012

Есть 3 разных библиотеки, которые обертывают libmagic.

2 из них доступны на pypi (поэтому установка pip будет работать):

  • filemagic
  • питон-магия

И еще один, похожий на python-magic, доступен непосредственно в последних источниках libmagic, и он, вероятно, есть в вашем дистрибутиве linux.

В Debian пакет python-magic примерно такой же, и он используется, как сказал toivotuo, и не устарел, как сказал Саймон Циммерман (ИМХО).

Мне кажется, это еще один дубль (автор оригинальной версии libmagic).

Очень жаль, что недоступно напрямую в pypi.

9 голосов
/ 02 ноября 2009

в Python 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
6 голосов
/ 03 февраля 2015

Метод @ toivotuo работал лучше всего и надежнее для меня под python3. Моей целью было выявить сжатые файлы, которые не имеют надежного расширения .gz. Я установил python3-magic.

import magic

filename = "./datasets/test"

def file_mime_type(filename):
    m = magic.open(magic.MAGIC_MIME)
    m.load()
    return(m.file(filename))

print(file_mime_type(filename))

для сжатого файла возвращается: Приложение / GZIP; кодировка = двоичный

для разархивированного текстового файла (данные iostat): текст / равнина; Charset = US-ASCII

для файла tar: применение / х-смола; кодировка = двоичный

для файла bz2: применение / х-bzip2; кодировка = двоичный

и, наконец, для меня .zip файл: Применение / застежка-молния; кодировка = двоичный

6 голосов
/ 04 сентября 2008

Вы не указали, какой веб-сервер вы используете, но у Apache есть симпатичный маленький модуль под названием Mime Magic , который он использует для определения типа файла, когда ему это сказано. Он читает часть содержимого файла и пытается выяснить, какой тип основан на найденных символах. * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Пример не * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * на 100% *.

В качестве альтернативы, если вы сидите на коробке UNIX, вы можете использовать sys.popen('file -i ' + fileName, mode='r'), чтобы получить тип MIME. Windows должна иметь эквивалентную команду, но я не уверен, что это такое.

5 голосов
/ 22 июня 2018

Привязки Python к libmagic

Все разные ответы по этой теме очень запутаны, поэтому я надеюсь дать немного большей ясности в этом обзоре различных привязок libmagic. Ранее mammadori дал короткий ответ , перечисляющий доступную опцию.

libmagic

При определении MIME-типа файлов выбранный инструмент просто называется file, а его серверная часть называется libmagic. (См. Домашнюю страницу Project .) Проект разработан в частном cvs-репозитории, но на github .

есть git-зеркало только для чтения.

Теперь этот инструмент, который вам понадобится, если вы хотите использовать какие-либо связки libmagic с python, уже поставляется с собственными привязками python, которые называются

file-magic. Для них не так много специальной документации, но вы всегда можете взглянуть на справочную страницу библиотеки c: man libmagic. Основное использование описано в файле readme :
import magic

detected = magic.detect_from_filename('magic.py')
print 'Detected MIME type: {}'.format(detected.mime_type)
print 'Detected encoding: {}'.format(detected.encoding)
print 'Detected file type name: {}'.format(detected.name)

Кроме того, вы также можете использовать библиотеку, создав объект Magic, используя magic.open(flags), как показано в файле примера .

Оба toivotuo и ewr2san используют эти file-magic привязки, включенные в инструмент file. Они ошибочно предполагают, что используют пакет python-magic. Это указывает на то, что если установлены оба file и python-magic, модуль python magic ссылается на предыдущий.

питон-магия

Это библиотека, о которой говорит Саймон Циммерман в его ответе , и которая также используется Клодом КУЛОМБОМ и Gringo Suave .

filemagic

Примечание : последний раз проект был обновлен в 2013 году!

Поскольку эта библиотека основана на одном и том же c-api, она имеет некоторое сходство с file-magic, включенным в libmagic. Это упоминается только mammadori , и никакой другой ответ не использует его.

5 голосов
/ 15 октября 2017

2017 Обновление

Нет необходимости переходить на github, он находится на PyPi под другим именем:

pip3 install --user python-magic
# or:
sudo apt install python3-magic  # Ubuntu distro package

Код также можно упростить:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'
...