Como encontrar o tipo de mime de um arquivo em python?

votos
133

Vamos dizer que você deseja salvar um monte de arquivos em algum lugar, por exemplo, em BLOBs. Vamos dizer que você quer repartir esses arquivos para fora através de uma página web e ter o cliente abra automaticamente a correcta aplicação / espectador.

Assunção: O navegador descobre quais application / espectador a usar pelo mime-type (tipo de conteúdo?) Cabeçalho na resposta HTTP.

Com base nessa premissa, além dos bytes do arquivo, você também quiser salvar o tipo de MIME.

Como você encontrar o tipo MIME de um arquivo? Atualmente estou em um Mac, mas isso também deve funcionar no Windows.

Será que o navegador adicionar esta informação ao postar o arquivo para a página de web?

Existe uma biblioteca python puro para encontrar esta informação? A WebService ou (melhor ainda) um banco de dados para download?

Publicado 04/09/2008 em 13:07
fonte usuário
Em outras línguas...                            


18 respostas

votos
157

O método python-magic sugerido por toivotuo está desatualizado. Do Python-magic tronco atual é no Github e com base no readme lá, encontrar o tipo MIME, é feito assim.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
Respondeu 02/05/2010 em 13:02
fonte usuário

votos
68

O módulo mimetypes na biblioteca padrão irá determinar / adivinhar o tipo MIME de uma extensão de arquivo.

Se os usuários estiverem upload de arquivos do HTTP post irá conter o tipo MIME do arquivo junto com os dados. Por exemplo, o Django torna esta informação disponível como um atributo da UploadedFile objecto.

Respondeu 04/09/2008 em 13:12
fonte usuário

votos
41

maneira mais confiável do que usar a biblioteca mimetypes seria usar o pacote python-magia.

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

Isso seria equivalente a usar arquivo (1).

No Django pode-se também certificar-se de que o tipo MIME corresponde ao de UploadedFile.content_type.

Respondeu 25/01/2010 em 17:39
fonte usuário

votos
21

Este parece ser muito fácil

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

Por favor, consulte Old Post

Respondeu 13/02/2014 em 14:09
fonte usuário

votos
9

Existem 3 bibliotecas diferentes que envolve libmagic.

2 deles estão disponíveis no pypi (assim pip instalar vai funcionar):

  • filemagic
  • python-magic

E outra, semelhante ao python-magic está disponível diretamente nas fontes mais recentes libmagic, e é o que você provavelmente tem em sua distribuição Linux.

No Debian o pacote python-magic é sobre um presente e ele é usado como toivotuo disse e não é obsoleto como Simon Zimmermann disse (IMHO).

Parece-me outra tomada (pelo autor original da libmagic).

Pena que não está disponível diretamente na pypi.

Respondeu 06/09/2012 em 11:22
fonte usuário

votos
8

em python 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
Respondeu 02/11/2009 em 16:48
fonte usuário

votos
6

Você não especificou o servidor web que você estava usando, mas Apache tem um pequeno módulo agradável chamada Mime mágico que ele usa para determinar o tipo de um arquivo quando disse para fazê-lo. Ele lê alguns dos conteúdos do arquivo e tenta descobrir que tipo é baseado nos personagens encontrados. E como Dave Webb Mencionado o mimeTypes Módulo sob python vai funcionar, desde uma extensão é útil.

Alternativamente, se você está sentado em uma caixa de UNIX você pode usar sys.popen('file -i ' + fileName, mode='r')para pegar o tipo MIME. Windows deve ter um comando equivalente, mas não estou certo sobre o que ele é.

Respondeu 04/09/2008 em 13:22
fonte usuário

votos
5

método de @toivotuo trabalhou melhor e mais confiável para mim sob python3. Meu objetivo era identificar arquivos gzipped que não têm uma extensão .gz confiável. Eu instalei 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))

para um arquivo compactado ele retorna: application / gzip; charset = binário

para um arquivo descompactado txt (iostat de dados): text / plain; charset = us-ascii

para um arquivo tar: application / x-tar; charset = binário

para um arquivo bz2: application / x-bzip2; charset = binário

e por último mas não menos importante para mim um arquivo .zip: application / zip; charset = binário

Respondeu 03/02/2015 em 19:09
fonte usuário

votos
4

Em Python 3.x e webapp com url para o arquivo que não pode ter uma extensão ou uma extensão falsa. Você deve instalar python-magic, usando

pip3 install python-magic

Para Mac OS X, você também deve instalar libmagic usando

brew install libmagic

Fragmento de código

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)

Alternativamente, você pode colocar um tamanho para a leitura

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)
Respondeu 06/09/2016 em 19:55
fonte usuário

votos
3

O módulo mimetypes apenas reconhecem um tipo de arquivo com base na extensão do arquivo. Se você vai tentar recuperar um tipo de um arquivo de arquivo sem extensão, os mimetypes não vai trabalhos.

Respondeu 19/06/2012 em 13:51
fonte usuário

votos
2

2017 Atualização

Não há necessidade de ir para github, é em PyPI sob um nome diferente:

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

O código pode ser simplificado assim:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'
Respondeu 15/10/2017 em 19:09
fonte usuário

votos
1

Ligações Python para libmagic

Todas as diferentes respostas sobre este tema são muito confusas, por isso estou esperando para dar um pouco mais de clareza com esta visão geral das diferentes ligações de libmagic. Anteriormente mammadori deu uma resposta curta lista a opção disponível.

libmagic

Ao determinar a arquivos mime-type, a ferramenta de escolha é simplesmente chamado filee seu back-end é chamado libmagic. (Veja a página inicial do projeto .) O projeto é desenvolvido em um cvs-repositório privado, mas há um espelho git só de leitura no github .

Agora esta ferramenta, o que você vai precisar se você quiser usar qualquer uma das ligações libmagic com python, já vem com suas próprias ligações Python chamado file-magic. Não há muita documentação dedicado para eles, mas você pode sempre ter um olhar para a página do manual do c-biblioteca: man libmagic. O uso básico é descrito no arquivo leia-me :

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)

Além disso, você também pode usar a biblioteca criando um Magicobjeto usando magic.open(flags)como mostrado no exemplo de arquivo .

Ambos toivotuo e ewr2san usar estas file-magicligações incluídas na fileferramenta. Eles erroneamente supor, eles estão usando o python-magicpacote. Isto parece indicar que, se ambos filee python-magicsão instalados, o módulo python magicrefere-se ao anterior.

python-magic

Esta é a biblioteca que Simon Zimmermann fala sobre em sua resposta e que também é empregado por Claude Coulombe , bem como Gringo Suave .

filemagic

Nota : Este projeto foi atualizado em 2013!

Devido a ser baseado no mesmo c-api, esta biblioteca tem alguma semelhança com file-magicincluído no libmagic. Ele só é mencionado por mammadori e nenhuma outra resposta emprega-lo.

Respondeu 22/06/2018 em 10:25
fonte usuário

votos
0

python 3 ref: https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type (url, rigorosa = True) Adivinha o tipo de um arquivo com base em seu nome de arquivo ou URL, dada pela url. O valor de retorno é um tuplo (tipo, codificação), onde tipo é Sem se o tipo não pode ser imaginado (ausente ou desconhecido sufixo) ou uma cadeia da forma 'tipo / subtipo', utilizáveis ​​para um cabeçalho do tipo MIME conteúdo.

Nenhum codificação é para nenhuma codificação ou o nome do programa utilizado para codificar (por exemplo, comprimir ou gzip). A codificação é adequado para uso como um cabeçalho-Encoding, não como um cabeçalho Content-Transfer-Encoding. Os mapeamentos são conduzidos mesa. sufixos de codificação são sensíveis; Tipo sufixos são tentou primeiro caso sensível, então caso insensível.

O argumento rigoroso opcional é um indicador que especifica se a lista de tipos MIME conhecidos é limitada a apenas os tipos oficiais registrados com IANA. Quando estrita é True (o padrão), apenas os tipos IANA são suportados; quando estrita é False, alguns tipos MIME adicionais não-padrão, mas comumente usados ​​também são reconhecidos.

import mimetypes
print(mimetypes.guess_type("sample.html"))
Respondeu 15/09/2019 em 08:05
fonte usuário

votos
0

Tento biblioteca mimetypes primeiro. Se ele não está funcionando, eu uso libary python-magic vez.

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
Respondeu 22/05/2019 em 04:18
fonte usuário

votos
0

Para dados byte tipo Array você pode usar magic.from_buffer (_byte_array, mime = True)

Respondeu 25/07/2018 em 04:43
fonte usuário

votos
0

Isso pode ser velho já, mas por que não usar UploadedFile.content_type diretamente de Django? Não é o mesmo? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )

Respondeu 31/10/2017 em 14:32
fonte usuário

votos
0

Eu tentei um monte de exemplos, mas com Django mutagen funciona muito bem.

Exemplo de verificação se os arquivos é mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

A desvantagem é que a sua capacidade de verificar os tipos de arquivo é limitado, mas é uma ótima maneira se você não quer só buscar por tipo de arquivo, mas também para aceder a informação adicional.

Respondeu 19/08/2017 em 10:33
fonte usuário

votos
-2

você pode usar imghdr módulo Python.

Respondeu 23/05/2012 em 05:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more