Digamos que você queira salvar um monte de arquivos em algum lugar, por exemplo, em BLOBs. Digamos que você queira distribuir esses arquivos por meio de uma página da Web e fazer com que o cliente abra automaticamente o aplicativo / visualizador correto.
Suposição: O navegador descobre qual aplicativo / visualizador usar pelo cabeçalho mime-type (content-type?) Na resposta HTTP.
Com base nessa suposição, além dos bytes do arquivo, você também deseja salvar o tipo MIME.
Como você encontraria o tipo MIME de um arquivo? Atualmente, estou em um Mac, mas isso também deve funcionar no Windows.
O navegador adiciona essas informações ao postar o arquivo na página da web?
Existe uma biblioteca python pura para encontrar essas informações? Um WebService ou (melhor ainda) um banco de dados para download?
import magic
apenas conteúdo incompatível. Consulte stackoverflow.com/a/16203777/3189 para obter mais informações.O módulo mimetypes na biblioteca padrão determina / adivinha o tipo MIME a partir de uma extensão de arquivo.
Se os usuários estiverem carregando arquivos, a postagem HTTP conterá o tipo MIME do arquivo juntamente com os dados. Por exemplo, o Django disponibiliza esses dados como um atributo do objeto UploadedFile .
fonte
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(como sugerido na resposta superior) é ainda menor, conforme confirmado em github.com/s3tools/s3cmd/issues/198 . Então,mimetypes
parece um candidato melhor para mim.Uma maneira mais confiável do que usar a biblioteca mimetypes seria usar o pacote python-magic.
Isso seria equivalente ao uso do arquivo (1).
No Django, também é possível garantir que o tipo MIME corresponda ao do UploadedFile.content_type.
fonte
Isso parece ser muito fácil
Consulte o Post Antigo
Atualização - Conforme comentário do @Garrets, no python 3 é mais simples:
fonte
Existem 3 bibliotecas diferentes que agrupam a libmagic.
2 deles estão disponíveis no pypi (para que a instalação do pip funcione):
E outro, semelhante ao python-magic, está disponível diretamente nas fontes libmagic mais recentes, e é o que você provavelmente possui em sua distribuição linux.
No Debian, o pacote python-magic é sobre esse e é usado como o toivotuo disse e não é obsoleto como Simon Zimmermann disse (IMHO).
Parece-me outra visão (do autor original da libmagic).
Pena que não está disponível diretamente no pypi.
fonte
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
no python 2.6:
fonte
file
comando é basicamente apenas um invólucro da libmagic. Você também pode usar a ligação python (python-magic), como na resposta de Simon.Atualização de 2017
Não é necessário acessar o github, ele está no PyPi com um nome diferente:
O código também pode ser simplificado:
fonte
Ligações Python ao libmagic
Todas as respostas diferentes sobre este tópico são muito confusas, então espero dar um pouco mais de clareza com esta visão geral das diferentes ligações da libmagic. Anteriormente, mammadori deu uma resposta curta listando a opção disponível.
libmagic
magic
Ao determinar um tipo MIME de arquivos, a ferramenta de escolha é simplesmente chamada
file
e seu back-end é chamadolibmagic
. (Veja a página inicial do projeto .) O projeto é desenvolvido em um repositório cvs privado, mas há um espelho git somente leitura no github .Agora, esta ferramenta, que você precisará se desejar usar qualquer uma das ligações libmagic com python, já vem com suas próprias ligações python chamadas
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 :Além disso, você também pode usar a biblioteca criando um
Magic
objeto usandomagic.open(flags)
como mostrado no arquivo de exemplo .O toivotuo e o ewr2san usam essas
file-magic
ligações incluídas nafile
ferramenta. Eles assumem erroneamente que estão usando opython-magic
pacote. Isso parece indicar que, se ambosfile
epython-magic
estiverem instalados, o módulo pythonmagic
se refere ao anterior.python-magic
magic
Esta é a biblioteca que Simon Zimmermann fala em sua resposta e que também é empregada por Claude COULOMBE e Gringo Suave .
filemagic
magic
Nota : Este projeto foi atualizado pela última vez em 2013!
Por se basear no mesmo c-api, esta biblioteca tem alguma semelhança com o
file-magic
incluído nolibmagic
. Só é mencionado por mammadori e nenhuma outra resposta o emprega.fonte
O método do @toivotuo funcionou melhor e mais confiável para mim no python3. Meu objetivo era identificar arquivos compactados com gzip que não possuem uma extensão .gz confiável. Eu instalei o python3-magic.
para um arquivo compactado com gzip, ele retorna: application / gzip; charset = binário
para um arquivo txt descompactado (dados do iostat): texto / sem formatação; 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, um arquivo .zip: application / zip; charset = binário
fonte
python 3 ref: https://docs.python.org/3.2/library/mimetypes.html
fonte
Você não indicou qual servidor da Web estava usando, mas o Apache possui um pequeno módulo chamado Mime Magic, que é usado para determinar o tipo de arquivo quando solicitado. Ele lê parte do conteúdo do arquivo e tenta descobrir que tipo ele é baseado nos caracteres encontrados. E como Dave Webb mencionou, o MimeTypes Module em python funcionará, desde que uma extensão seja útil.
Como alternativa, se você estiver sentado em uma caixa UNIX, poderá usar
sys.popen('file -i ' + fileName, mode='r')
para pegar o tipo MIME. O Windows deve ter um comando equivalente, mas não tenho certeza sobre o que é.fonte
No Python 3.xe webapp com URL para o arquivo que não poderia ter uma extensão ou uma extensão falsa. Você deve instalar o python-magic, usando
No Mac OS X, você também deve instalar a libmagic usando
Fragmento de código
Como alternativa, você pode colocar um tamanho na leitura
fonte
Eu tento a biblioteca de tipos MIME primeiro. Se não estiver funcionando, eu uso a biblioteca python-magic.
fonte
O módulo mimetypes apenas reconhece um tipo de arquivo com base na extensão do arquivo. Se você tentar recuperar um tipo de arquivo sem extensão, os tipos MIME não funcionarão.
fonte
Estou surpreso que ninguém tenha mencionado isso, mas a Pygments é capaz de adivinhar o tipo mímico de, particularmente, documentos de texto.
Pygments é na verdade uma biblioteca de realce de sintaxe Python, mas possui um método que dará um palpite sobre qual dos 500 tipos de documentos suportados é o seu documento. ou seja, c ++ vs c # vs python vs etc
Resultado:
Agora, não é perfeito, mas se você precisar saber qual dos 500 formatos de documento está sendo usado, isso é bastante útil.
fonte
Eu tentei muitos exemplos, mas com o Django o mutagen toca bem.
Exemplo verificando se os arquivos estão
mp3
A desvantagem é que sua capacidade de verificar os tipos de arquivo é limitada, mas é uma ótima maneira, se você deseja não apenas verificar o tipo de arquivo, mas também acessar informações adicionais.
fonte
Isso já pode ser antigo, mas por que não usar o UploadedFile.content_type diretamente do Django? Não é o mesmo? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
fonte
Para dados do tipo Matriz de bytes, você pode usar magic.from_buffer (_byte_array, mime = True)
fonte
você pode usar o módulo imghdr Python.
fonte