Pergunta

Vamos dizer que você deseja salvar um monte de arquivos em algum lugar, por exemplo, em BLOBs.Vamos dizer que você deseja prato estes arquivos através de uma página da web e o cliente, automaticamente, abra o aplicativo correto/espectador.

Suposição:O navegador figuras a aplicação que o/viewer para usar o mime-type (tipo de conteúdo?) cabeçalho de resposta HTTP.

Com base no pressuposto de que, além de os bytes do arquivo, você também queira salvar o tipo de MIME.

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

O navegador adicionar esta informação ao postar o arquivo para a página da web?

Há uma boa biblioteca em python para encontrar esta informação?Um WebService ou (melhor ainda) um banco de dados para download?

Foi útil?

Solução

O python-magia método sugerido por toivotuo está desatualizado. Python-a magia do atual tronco está no Github e com base no readme lá, encontrando o MIME-type, é feito assim.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>

Outras dicas

O mimetypes módulo na biblioteca padrão vai determinar o/acho que o tipo MIME de um arquivo de extensão.

Se os usuários estão fazendo o upload de arquivos HTTP post irá conter o tipo MIME do arquivo juntamente com os dados.Por exemplo, o Django faz esse dados disponíveis como um atributo do UploadedFile objecto.

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

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 certifique-se de que o tipo de MIME corresponde ao que UploadedFile.content_type.

Esta 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 Post Antigo

Existem 3 tipos diferentes de bibliotecas que envolve libmagic.

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

  • filemagic
  • python-magia

E outra, similar ao python-magic está disponível diretamente no mais recente libmagic fontes, e que é o que você provavelmente tem em sua distribuição linux.

No Debian, o pacote python-a magia é sobre isso e que é utilizada como toivotuo disse e não é obsoleto como Simon Zimmermann disse (IMHO).

Parece-me outro levar (pelo autor original do libmagic).

Muito ruim não está disponível diretamente no pypi.

em python 2.6:

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

Você não indicar o servidor web que você estava usando, mas o Apache tem um pouco agradável módulo chamado Mime Magia que ele usa para determinar o tipo de um arquivo quando disse para fazer isso.Ele lê alguns o conteúdo do arquivo e tenta descobrir de que tipo é baseado nos personagens encontrados.E como Dave Webb Mencionado o MimeTypes Módulo em python vai funcionar, desde uma extensão é útil.

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

@toivotuo 's método funcionou melhor e mais confiável para mim sob python3.Meu objetivo era identificar compactado arquivos que não têm uma confiança .gz extensão.Eu instalei o python3-magia.

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 do arquivo, ele retorna:aplicação/gzip;charset=binário

para um descompactou o arquivo 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 .arquivo zip:application/zip;charset=binário

No Python 3.x e webapp com a url para o arquivo que não poderia ter uma extensão ou um falso extensão.Você deve instalar o python-magia, usando

pip3 install python-magic

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

brew install libmagic

Snippet 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ê poderia 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)

2017 Atualização

Não há necessidade de ir para o github, é no 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'

Python bindings para libmagic

Todas as respostas diferentes sobre este tema são muito confuso, então eu estou esperando para dar um pouco mais de clareza com esta visão geral dos diferentes enlaces de libmagic.Anteriormente mammadori deu um resposta curta a listagem a opção disponível.

libmagic

Ao determinar um arquivos de tipo mime, a ferramenta de escolha é chamado simplesmente de file e o seu back-end é chamado de libmagic.(Ver o Página inicial do projeto.) O projeto é desenvolvido em uma privada cvs-repositório, mas há um somente leitura git espelho no github.

Agora esta ferramenta, o que você vai precisar se você quiser usar qualquer um dos libmagic ligações com o python, já vem com o seu próprio python bindings chamado file-magic.Não há muita documentação dedicada para eles, mas você pode sempre ter um olhar para o homem da página da biblioteca c: man libmagic.O uso básico é descrito no arquivo leiame:

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 de criação de um Magic objeto usando magic.open(flags) como mostrado na exemplo de arquivo.

Ambos toivotuo e ewr2san usar esses file-magic ligações incluídas no file ferramenta.Eles presumem, erroneamente, que eles estão usando a python-magic pacote. Isso parece indicar que, se ambas file e python-magic são instalados, o módulo python magic refere-se ao anterior.

python-magia

Esta é a biblioteca que Simon Zimmermann fala na sua resposta e que também é empregado por Claude COULOMBE bem como Gringo Suave.

filemagic

Nota:Este projeto foi atualizada em 2013!

Por ser baseado no mesmo c-api, esta biblioteca tem alguma semelhança com file-magic incluído em libmagic.Ele é mencionado apenas por mammadori e não há outra resposta o emprega.

Os mimetypes módulo de apenas reconhecer um tipo de ficheiro com base na extensão do arquivo.Se você vai tentar recuperar um tipo de arquivo de um arquivo sem extensão, os mimetypes não funciona.

Eu ja tentei um monte de exemplos, mas com Django agente mutagênico joga muito bem.

Exemplo de verificar 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 sua capacidade de seleção de tipos de arquivo é limitado, mas é uma ótima forma, se você quiser não apenas de verificação para o tipo de arquivo, mas também para o acesso a informações adicionais.

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

Para a Matriz de bytes do tipo de dados que você pode usar magia.from_buffer(_byte_array,mime=True)

Eu tento mimetypes biblioteca pela primeira vez.Se não funcionar, eu uso python-magia libary em vez disso.

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

você pode usar imghdr Módulo Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top