Допустим, вы хотите сохранить несколько файлов где-нибудь, например, в BLOB. Допустим, вы хотите выложить эти файлы через веб-страницу, и клиент автоматически открывает нужное приложение / средство просмотра.
Предположение: браузер выясняет, какое приложение / средство просмотра использовать заголовком mime-type (content-type?) В ответе HTTP.
Исходя из этого предположения, помимо байтов файла, вы также хотите сохранить тип MIME.
Как бы вы нашли MIME-тип файла? Я в настоящее время на Mac, но это также должно работать на Windows.
Добавляет ли браузер эту информацию при публикации файла на веб-странице?
Есть ли аккуратная библиотека Python для поиска этой информации? Веб-сервис или (что еще лучше) загружаемая база данных?
import magic
имеют несовместимое содержание. См. Stackoverflow.com/a/16203777/3189 для получения дополнительной информации.Модуль mimetypes в стандартной библиотеке будет определять / угадывать MIME-тип по расширению файла.
Если пользователи загружают файлы, сообщение HTTP будет содержать MIME-тип файла вместе с данными. Например, Django делает эти данные доступными в качестве атрибута объекта UploadedFile .
источник
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(как предложено в верхнем ответе) еще ниже, что подтверждается github.com/s3tools/s3cmd/issues/198 . Так что,mimetypes
кажется, лучший кандидат для меня.Более надежный способ, чем использовать библиотеку mimetypes, - использовать пакет python-magic.
Это было бы эквивалентно использованию файла (1).
В Django можно также убедиться, что тип MIME совпадает с типом UploadedFile.content_type.
источник
Это кажется очень простым
Пожалуйста, обратитесь Старый пост
Обновление - согласно комментарию @Garrets, в python 3 это более просто:
источник
Есть 3 разных библиотеки, которые обертывают libmagic.
2 из них доступны на pypi (поэтому установка pip будет работать):
И еще один, похожий на python-magic, доступен непосредственно в последних источниках libmagic, и он, вероятно, есть в вашем дистрибутиве Linux.
В Debian пакет python-magic об этом и используется, как сказал toivotuo, и не устарел, как сказал Саймон Циммерман (IMHO).
Мне кажется, еще один вариант (автором libmagic).
Жаль, что не доступен непосредственно на Pypi.
источник
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
в Python 2.6:
источник
file
команда в основном является оболочкой libmagic. Вы можете также использовать привязку python (python-magic), как в ответе Саймона.Обновление 2017
Нет необходимости переходить на github, он находится на PyPi под другим именем:
Код также может быть упрощен:
источник
Привязки Python к libmagic
Все разные ответы на эту тему очень запутаны, поэтому я надеюсь дать немного большей ясности в этом обзоре различных привязок libmagic. Ранее Маммадори дал краткий ответ с перечислением доступных вариантов.
libmagic
magic
При определении MIME-типа файлов просто вызывается инструмент выбора и вызывается
file
его серверная частьlibmagic
. (См. Домашнюю страницу проекта .) Проект разработан в частном cvs-хранилище, но на github есть зеркало git , доступное только для чтения. .Теперь этот инструмент, который вам понадобится, если вы хотите использовать какие-либо привязки libmagic с python, уже поставляется с собственными привязками python, которые называются
file-magic
. Существует не так много посвященных документаций для них, но вы всегда можете посмотреть на человек странице с-библиотеке:man libmagic
. Основное использование описано в файле readme :Помимо этого, вы также можете использовать библиотеку, создав
Magic
объект, используя,magic.open(flags)
как показано в файле примера .И toivotuo, и ewr2san используют эти
file-magic
привязки, включенные вfile
инструмент. Они ошибочно предполагают, что используютpython-magic
пакет. Кажется, это указывает на то, что если обаfile
иpython-magic
установлены, модуль pythonmagic
ссылается на первый.питон-магия
magic
Это библиотека, о которой говорит Саймон Циммерман в своем ответе, и которая также используется Клодом Куломбом и Гринго Суаве .
filemagic
magic
Заметка : последний раз проект обновлялся в 2013 году!
Благодаря тому, что эта библиотека основана на одном и том же c-api, она имеет некоторое сходство с
file-magic
включенной вlibmagic
. Это упоминается только маммадори, и никакой другой ответ не использует его.источник
Метод @toivotuo работал лучше и надежнее для меня под python3. Моя цель состояла в том, чтобы идентифицировать сжатые файлы, которые не имеют надежного расширения .gz. Я установил python3-magic.
для сжатого файла возвращается: application / gzip; кодировка = двоичное
для распакованного txt-файла (данные iostat): text / plain; Charset = US-ASCII
для файла tar: application / x-tar; кодировка = двоичное
для файла bz2: application / x-bzip2; кодировка = двоичное
и последний, но не менее важный для меня .zip файл: application / zip; кодировка = двоичное
источник
ссылка на python 3: https://docs.python.org/3.2/library/mimetypes.html
источник
Вы не указали, какой веб-сервер вы используете, но у Apache есть симпатичный маленький модуль, называемый Mime Magic, который он использует для определения типа файла, когда ему это сказано. Он читает часть содержимого файла и пытается выяснить, какой тип основан на найденных символах. И как Дэйв Уэбб Упоминается в Mimetypes Модуль под питона будет работать, если расширение удобно.
В качестве альтернативы, если вы сидите в окне UNIX, вы можете использовать,
sys.popen('file -i ' + fileName, mode='r')
чтобы получить MIME-тип. Windows должна иметь эквивалентную команду, но я не уверен, что это такое.источник
В Python 3.x и веб-приложении с URL-адресом файла, который не может иметь расширение или поддельное расширение. Вы должны установить Python-Magic, используя
Для Mac OS X вы также должны установить libmagic, используя
Фрагмент кода
в качестве альтернативы вы можете поместить размер в чтение
источник
Я сначала пробую библиотеку mimetypes. Если это не работает, я использую библиотеку python-magic вместо этого.
источник
Модуль mimetypes просто распознает тип файла на основе расширения файла. Если вы попытаетесь восстановить тип файла без расширения, mimetypes не будет работать.
источник
Я удивлен, что никто не упомянул об этом, но Pygments способен сделать обоснованное предположение о типе пантомимы, в частности, текстовых документов.
На самом деле Pygments - это библиотека подсветки синтаксиса Python, но в ней есть метод, позволяющий сделать обоснованное предположение о том, какой из 500 поддерживаемых типов документов является вашим документом. то есть c ++ против C # против Python против и т. д.
Вывод:
Теперь это не идеально, но если вам нужно определить, какой из 500 форматов документов используется, это чертовски полезно.
источник
Я пробовал много примеров, но с Django мутаген играет хорошо.
Пример проверки наличия файлов
mp3
Недостатком является то, что ваша способность проверять типы файлов ограничена, но это отличный способ, если вы хотите не только проверить тип файла, но и получить доступ к дополнительной информации.
источник
Это может быть уже старым, но почему бы не использовать UploadedFile.content_type напрямую из Django? Разве это не то же самое? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
источник
Для данных типа байтового массива вы можете использовать magic.from_buffer (_byte_array, mime = True)
источник
Вы можете использовать модуль imghdr Python.
источник