¿Cómo encontrar el tipo mime de un archivo en Python?
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?
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'
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 .
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"))
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.
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 None
si 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 None
para 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 .