Supongamos que desea guardar un montón de archivos en algún lugar, por ejemplo, en BLOB. Supongamos que desea distribuir estos archivos a través de una página web y que el cliente abra automáticamente la aplicación / visor correcto.
Suposición: el navegador determina qué aplicación / visor debe usar el encabezado mime-type (content-type?) 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 cuando publica el archivo en la página web?
¿Hay una biblioteca de Python ordenada para encontrar esta información? ¿Un servicio web o (aún mejor) una base de datos descargable?
import magic
pero tienen contenidos incompatibles. Consulte stackoverflow.com/a/16203777/3189 para obtener más información.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 están cargando 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 .
fuente
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(como se sugiere en la respuesta superior) es aún menor, según lo confirmado por github.com/s3tools/s3cmd/issues/198 . Entonces,mimetypes
parece un mejor candidato para mí.Una forma más confiable de usar la biblioteca de tipos de mime sería utilizar el paquete python-magic.
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.
fuente
Esto parece ser muy fácil.
Por favor, consulte la publicación anterior
Actualización : según el comentario de @Garrets, en python 3 es más simple:
fuente
Hay 3 bibliotecas diferentes que envuelven libmagic.
2 de ellos están disponibles en pypi (por lo que la instalación de pip funcionará):
Y otro, similar a python-magic, está disponible directamente en las últimas fuentes de libmagic, y es el que probablemente tenga en su distribución de Linux.
En Debian, el paquete python-magic es sobre este y se usa como dijo toivotuo y no está obsoleto como dijo Simon Zimmermann (en mi humilde opinión).
Me parece otra toma (por el autor original de libmagic).
Lástima que no esté disponible directamente en pypi.
fuente
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
en python 2.6:
fuente
file
comando es básicamente un contenedor de libmagic. También puede usar el enlace de python (python-magic), como en la respuesta de Simon.Actualización 2017
No es necesario ir a github, está en PyPi con un nombre diferente:
El código también se puede simplificar:
fuente
Enlaces de Python a libmagic
Todas las diferentes respuestas sobre este tema son muy confusas, por lo que espero dar un poco más de claridad con esta descripción general de los diferentes enlaces de libmagic. Anteriormente, mammadori dio una respuesta breve que enumeraba la opción disponible.
libmagic
magic
Al determinar un tipo de archivos MIME, la herramienta de elección simplemente se llama
file
y se llama a su back-endlibmagic
. (Consulte la página de inicio del Proyecto ). El proyecto se desarrolla en un repositorio privado cvs, pero hay un espejo git de solo lectura en github .Ahora esta herramienta, que necesitará si desea utilizar cualquiera de los enlaces de libmagic con python, ya viene con sus propios enlaces de python llamados
file-magic
. No hay mucha documentación específica para ellos, pero siempre se puede echar un vistazo a la página del manual de la biblioteca C:man libmagic
. El uso básico se describe en el archivo Léame :Además de esto, también puede usar la biblioteca creando un
Magic
objeto usandomagic.open(flags)
como se muestra en el archivo de ejemplo .Tanto toivotuo como ewr2san usan estos
file-magic
enlaces incluidos en lafile
herramienta. Asumen erróneamente que están usando elpython-magic
paquete. Esto parece indicar, que si ambosfile
ypython-magic
están instalados, el módulo de Pythonmagic
se refiere a la anterior.pitón-magia
magic
Esta es la biblioteca de la que Simon Zimmermann habla en su respuesta y que también es empleada por Claude COULOMBE y Gringo Suave .
filemagic
magic
Nota : ¡Este proyecto se actualizó por última vez en 2013!
Debido a que se basa en la misma c-api, esta biblioteca tiene cierta similitud con la
file-magic
incluida enlibmagic
. Mammadori solo lo menciona y ninguna otra respuesta lo emplea.fuente
El método de @toivotuo funcionó mejor y más confiable para mí en python3. Mi objetivo era identificar los archivos comprimidos que no tienen una extensión .gz confiable. Instalé python3-magic.
para un archivo comprimido devuelve: application / gzip; juego de caracteres = binario
para un archivo txt descomprimido (datos de iostat): text / plain; charset = us-ascii
para un archivo tar: application / x-tar; juego de caracteres = binario
para un archivo bz2: application / x-bzip2; juego de caracteres = binario
y por último, pero no menos importante para mí, un archivo .zip: application / zip; juego de caracteres = binario
fuente
Python 3 ref: https://docs.python.org/3.2/library/mimetypes.html
fuente
No indicó qué servidor web estaba utilizando, pero Apache tiene un pequeño y agradable módulo llamado Mime Magic que utiliza para determinar el tipo de archivo cuando se le indica que lo haga. Lee parte del contenido del archivo e intenta averiguar qué tipo se basa en los caracteres encontrados. Y como Dave Webb mencionó, el módulo MimeTypes en Python funcionará, siempre que una extensión sea útil.
Alternativamente, si está sentado en un cuadro de UNIX, puede usar
sys.popen('file -i ' + fileName, mode='r')
para tomar el tipo MIME. Windows debería tener un comando equivalente, pero no estoy seguro de qué es.fuente
En Python 3.xy webapp con url al archivo que no podía tener una extensión o una extensión falsa. Debes instalar python-magic, usando
Para Mac OS X, también debe instalar libmagic usando
Fragmento de código
alternativamente, podría poner un tamaño en la lectura
fuente
Intento primero la biblioteca mimetypes. Si no funciona, utilizo la biblioteca python-magic en su lugar.
fuente
El módulo mimetypes solo reconoce un tipo de archivo basado en la extensión del archivo. Si intenta recuperar un tipo de archivo sin extensión, los tipos mime no funcionarán.
fuente
Me sorprende que nadie lo haya mencionado, pero Pygments es capaz de hacer una conjetura sobre el tipo de mimo de, en particular, los documentos de texto.
Pygments es en realidad una biblioteca de resaltado de sintaxis de Python, pero tiene un método que hará una suposición educada sobre cuál de los 500 tipos de documentos admitidos es su documento. es decir, C ++ vs C # vs Python vs etc.
Salida:
Ahora, no es perfecto, pero si necesita saber cuál de los 500 formatos de documentos se están utilizando, esto es bastante útil.
fuente
He probado muchos ejemplos, pero con Django mutagen funciona muy bien.
Ejemplo de comprobación de si los archivos son
mp3
La desventaja es que su capacidad para verificar los tipos de archivos es limitada, pero es una excelente manera si no solo desea verificar el tipo de archivo sino también acceder a información adicional.
fuente
Esto ya puede ser antiguo, pero ¿por qué no usar UploadedFile.content_type directamente desde Django? ¿No es lo mismo? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
fuente
Para los datos de tipo de matriz de bytes, puede usar magic.from_buffer (_byte_array, mime = True)
fuente
puedes usar el módulo imghdr Python.
fuente