Как найти тип mime файла в python?

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

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

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

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

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

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

Ответ 1

Метод 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'
>>>

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

>>> 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)

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

Ответ 5

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

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

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

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

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

Мне кажется, что еще одно взятие (автор оригинала libmagic).

Слишком плохо не доступно прямо на pypi.

Ответ 6

в python 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]

Ответ 7

Вы не указали, какой веб-сервер вы использовали, но у Apache есть небольшой небольшой модуль под названием Mime Magic, который он использует для определения тип файла, когда ему говорят об этом. Он читает часть содержимого файла и пытается выяснить, какой тип он основан на найденных символах. И как Дэйв Уэбб упомянул, MimeTypes Module под python будет работать, если расширение удобно.

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

Ответ 8

@toivotuo метод работал лучше всего и наиболее надежно для меня под python3. Моя цель состояла в том, чтобы определить файлы gzipped, у которых нет надежного расширения .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))

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

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

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

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

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

Ответ 9

В Python 3.x и webapp с url к файлу, который не может иметь расширение или поддельное расширение. Вы должны установить python-magic, используя

pip3 install python-magic

Для Mac OS X вы также должны установить libmagic с помощью

brew install libmagic

Фрагмент кода

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.readline())
print(mime_type)

в качестве альтернативы вы можете поместить размер в чтение

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.read(128))
print(mime_type)

Ответ 10

Обновление 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'

Ответ 11

Привязки Python к libmagic

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

libmagic

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

Теперь этот инструмент, который вам понадобится, если вы хотите использовать какие-либо привязки libmagic с python, уже имеет собственные привязки python, называемые file-magic. Для них не так уж много специальной документации, но вы всегда можете взглянуть на man libmagic страницу библиотеки 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 включенные в file инструмент. Они ошибочно предполагают, что используют пакет python-magic. Кажется, это указывает на то, что если установлены и file и python-magic, magic модуля python ссылается на первый.

питон-магия

Это библиотека, о которой говорит Саймон Циммерман в своем ответе, и которая также используется Клодом Куломбом и Гринго Суаве.

filemagic

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

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

Ответ 12

Модуль mimetypes просто распознает тип файла на основе расширения файла. Если вы попытаетесь восстановить файл типа файла без расширения, то методы mimetypes не будут работать.

Ответ 13

Я пробовал много примеров, но с Django mutagen играет красиво.

Пример проверки, если файлы mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

try:
    audio = MP3(file)
except HeaderNotFoundError:
    raise ValidationError('This file should be mp3')

Недостатком является то, что ваша способность проверять типы файлов ограничена, но это отличный способ, если вы хотите не только проверить тип файла, но и получить доступ к дополнительной информации.

Ответ 15

Для данных типа байтового массива вы можете использовать magic.from_buffer (_byte_array, mime = True)

Ответ 16

Я сначала пробую библиотеку mimetypes. Если это не работает, я использую библиотеку python-magic вместо этого.

import mimetypes
def guess_type(filename, buffer=None):
mimetype, encoding = mimetypes.guess_type(filename)
if mimetype is None:
    try:
        import magic
        if buffer:
            mimetype = magic.from_buffer(buffer, mime=True)
        else:
            mimetype = magic.from_file(filename, mime=True)
    except ImportError:
        pass
return mimetype

Ответ 17

вы можете использовать imghdr модуль Python.