¿Cómo encontrar el tipo mime de un archivo en Python?

Resuelto Daren Thomas asked hace 16 años • 19 respuestas

Digamos que desea guardar un montón de archivos en algún lugar, por ejemplo en BLOB. Digamos que desea distribuir estos archivos a través de una página web y hacer que el cliente abra automáticamente la aplicación/visor correcto.

Supuesto: El navegador determina qué aplicación/visor usar mediante el encabezado de tipo mime (¿tipo de contenido?) en la respuesta HTTP.

Según esa suposición, además de los bytes del archivo, también desea guardar el tipo MIME.

¿Cómo encontrarías el tipo MIME de un archivo? Actualmente estoy en una Mac, pero esto también debería funcionar en Windows.

¿El navegador agrega esta información al publicar el archivo en la página web?

¿Existe una biblioteca Python ordenada para encontrar esta información? ¿Un WebService o (aún mejor) una base de datos descargable?

Daren Thomas avatar Sep 04 '08 19:09 Daren Thomas
Aceptado

El método python-magic sugerido por toivotuo está desactualizado. El tronco actual de Python-magic está en Github y, según el archivo Léame allí, encontrar el tipo MIME se hace de esta manera.

# For MIME types
import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'
Simon Klee avatar May 02 '2010 12:05 Simon Klee

El módulo mimetypes en la biblioteca estándar determinará/adivinará el tipo MIME a partir de una extensión de archivo.

Si los usuarios cargan archivos, la publicación HTTP contendrá el tipo MIME del archivo junto con los datos. Por ejemplo, Django hace que estos datos estén disponibles como un atributo del objeto UploadedFile .

David Webb avatar Sep 04 '2008 12:09 David Webb

Esto parece ser muy 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 la publicación anterior

Actualización : en la versión Python 3+, ahora es más conveniente:

import mimetypes
print(mimetypes.guess_type("sample.html"))
Laxmikant Ratnaparkhi avatar Feb 13 '2014 13:02 Laxmikant Ratnaparkhi

Una forma más confiable que usar la biblioteca mimetypes sería usar el paquete python-magic.

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

Esto sería equivalente a usar el archivo (1).

En Django también se puede asegurar que el tipo MIME coincida con el de UploadedFile.content_type.

toivotuo avatar Jan 25 '2010 16:01 toivotuo

13 años después...
La mayoría de las respuestas en esta página para Python 3 estaban desactualizadas o incompletas.
Para obtener el tipo mime de un archivo utilizo:

import mimetypes

mt = mimetypes.guess_type("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf")
if mt:
    print("Mime Type:", mt[0])
else:
    print("Cannot determine Mime Type")

# Mime Type: application/pdf

Demo en vivo


De documentos de Python :

mimetypes.guess_type( url , estricto=Verdadero )

Adivina el tipo de archivo según su nombre de archivo, ruta o URL, proporcionada por url . La URL puede ser una cadena o un objeto similar a una ruta .

El valor de retorno es una tupla (type, encoding)donde tipo es Nonesi el tipo no se puede adivinar (sufijo faltante o desconocido) o una cadena con el formato 'type/subtype', que se puede utilizar para un encabezado de tipo de contenido MIME .

codificación es Nonepara no codificar o el nombre del programa utilizado para codificar (por ejemplo, comprimir o gzip ). La codificación es adecuada para su uso como encabezado Content-Encoding , no como encabezado Content-Transfer-Encoding . Las asignaciones se basan en tablas. Los sufijos de codificación distinguen entre mayúsculas y minúsculas; los sufijos de tipo se prueban primero distinguiendo entre mayúsculas y minúsculas y luego sin distinguir entre mayúsculas y minúsculas.

El argumento estricto opcional es una bandera que especifica si la lista de tipos MIME conocidos se limita únicamente a los tipos oficiales registrados en la IANA . Cuando estricto es True(el valor predeterminado), solo se admiten los tipos de IANA; cuando estricto es False, también se reconocen algunos tipos MIME adicionales no estándar pero de uso común.

Modificado en la versión 3.8: se agregó soporte para que la URL sea un objeto similar a una ruta .

Pedro Lobito avatar Feb 02 '2021 15:02 Pedro Lobito