Comment trouver le type mime d'un fichier en python?

disons que vous voulez sauver un tas de fichiers quelque part, par exemple dans des BLOBs. Disons que vous voulez distribuer ces fichiers via une page web et que le client ouvre automatiquement la bonne application/viewer.

hypothèse: le navigateur détermine quelle application / visionneuse utiliser par le type mime (content-type?) en-tête de la réponse HTTP.

Basé sur cette hypothèse, outre les octets du fichier, vous aussi vous voulez enregistrer la Le type MIME.

Comment trouver le type MIME d'un fichier? Je suis actuellement sur un Mac, mais cela devrait aussi fonctionner sur Windows.

est-ce que le navigateur ajoute cette information lors de l'affichage du fichier sur la page web?

y a-t-il une bibliothèque Python soignée pour trouver cette information? Un service Web ou (encore mieux) une base de données téléchargeable?

145
demandé sur Daren Thomas 2008-09-04 16:07:27

16 réponses

la méthode python-magic suggérée par toivotuo est dépassée. Python-magic current trunk est à Github et basé sur le readme là, trouver le type MIME, est fait comme ceci.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
168
répondu Simon Zimmermann 2015-01-27 16:51:52

le module mimetypes de la bibliothèque standard va déterminer/deviner le type MIME d'une extension de fichier.

si les utilisateurs téléchargent des fichiers, le message HTTP contiendra le type MIME du fichier à côté des données. Par exemple, Django rend ces données disponibles en tant qu'attribut de l'objet UploadedFile .

74
répondu Dave Webb 2014-06-28 16:43:19

une façon plus fiable que d'utiliser la bibliothèque mimetypes serait d'utiliser le paquet python-magic.

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

cela équivaudrait à utiliser le fichier(1).

sur Django on pourrait également s'assurer que le type MIME correspond à celui du fichier téléchargé.content_type.

43
répondu toivotuo 2010-01-25 16:39:06

Cela semble être très facile

>>> 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)

consultez Ancienne Poste

21
répondu Laxmikant Ratnaparkhi 2017-05-23 12:10:10

il y a 3 bibliothèques différentes qui enveloppent libmagic.

2 d'entre eux sont disponibles sur pypi (donc pip install fonctionnera):

  • filemagic
  • python-magie

et un autre, similaire à python-magic est disponible directement dans les dernières sources libmagiques, et c'est celui que vous avez probablement dans votre distribution linux.

dans Debian le paquet python-magic est à propos de celui-ci et il est utilisé comme toivotuo dit et il n'est pas obsolète comme Simon Zimmermann dit (IMHO).

Il me semble d'une autre (par l'auteur original de libmagic).

dommage n'est pas disponible directement sur pypi.

10
répondu mammadori 2012-09-06 10:22:50

en python 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
8
répondu apito 2013-08-28 14:25:18

vous n'avez pas indiqué quel serveur web vous utilisiez, mais Apache a un joli petit module appelé Mime Magic qu'il utilise pour déterminer le type d'un fichier lorsqu'on lui demande de le faire. Il lit le contenu du fichier et tente de comprendre à quel type il est basé sur les caractères trouvés. Et comme Dave Webb a mentionné le Module MimeTypes sous python fonctionnera, à condition qu'une extension soit pratique.

alternativement, si vous êtes assis sur une boîte UNIX, vous pouvez utiliser sys.popen('file -i ' + fileName, mode='r') pour saisir le type MIME. Windows devrait avoir une commande équivalente, mais je ne suis pas sûr de ce que c'est.

6
répondu akdom 2017-05-23 11:47:23

@toivotuo ' s méthode a fonctionné le mieux et le plus fiable pour moi sous python3. Mon objectif était d'identifier les fichiers gzip qui n'est pas fiable .extension gz. J'ai installé python3-magie.

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))

pour un fichier gzippé il retourne: application/gzip; charset=binaire

pour un fichier txt Non zippé (données iostat): text / plain; charset=us-ascii

pour un fichier tar: application/ x-tar; charset=binaire

pour un fichier bz2: application/ x-bzip2; charset=binaire

et le dernier mais non le moindre pour moi A.fichier zip: application/ zip; charset=binaire

6
répondu ewr2san 2015-02-03 19:09:32

En Python 3.x et webapp avec l'url du fichier qui ne pouvait pas avoir une extension ou une fausse extension. Vous devez installer python-magic, en utilisant

pip3 install python-magic

pour Mac OS X, vous devez aussi installer libmagic en utilisant

brew install libmagic
"151940920 extrait de Code",

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)

alternativement vous pouvez mettre une taille dans le lire

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)
4
répondu Claude COULOMBE 2017-03-25 04:09:30

le module mimetypes reconnaît simplement un type de fichier basé sur l'extension du fichier. Si vous essayez de récupérer un type de fichier d'un fichier sans l'extension, les mimetypes ne fonctionne.

3
répondu Helder 2012-06-19 12:51:55

mise à jour 2017

Pas besoin d'aller à github, c'est sur PyPi sous un nom différent:

pip3 install --user python-magic
# or:
sudo apt install python3-magic  # Ubuntu distro package

le code peut également être simplifié:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'
3
répondu Gringo Suave 2018-01-29 18:01:51

liaisons Python pour libmagic

toutes les réponses sur ce sujet sont très confuses, donc j'espère donner un peu plus de clarté avec cet aperçu des différentes fixations de libmagic. Auparavant mammadori a donné une réponse courte la liste de l'option disponible.

libmagic

lors de la détermination d'un type mime de fichiers, l'outil de choix est simplement appelé file et son extrémité arrière est appelé libmagic . (Voir la page D'accueil du projet .) Le projet est développé dans un dépôt cvs privé, mais il existe un miroir git en lecture seule sur github .

maintenant cet outil, dont vous aurez besoin si vous voulez utiliser l'une des fixations libmagic avec python, est déjà fourni avec ses propres fixations python appelées file-magic . Il n'y a pas beaucoup de documentation dédiée pour eux, mais vous pouvez toujours jeter un coup d'oeil à la page de manuel de la bibliothèque c: man libmagic . L'utilisation de base est décrit dans la section fichier lisezmoi :

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)

mis à part cela, vous pouvez également utiliser la bibliothèque en créant un Magic objet en utilisant magic.open(flags) comme indiqué dans le exemple de fichier .

les deux toivotuo et ewr2san utilisent ces liants file-magic inclus dans l'outil file . Ils supposent par erreur, ils utilisent le paquet python-magic . cela semble indiquer que si les deux file et python-magic sont installés, le module python magic se réfère à l'ancien.

python-magie

C'est la bibliothèque dont parle Simon Zimmermann dans sa réponse et qui est également employée par Claude COULOMBE ainsi que Gringo Suave .

filemagic

Note : dernière mise à jour de ce projet en 2013!

en raison d'être basée sur la même api c, cette bibliothèque a une certaine similitude avec file-magic inclus dans libmagic . Elle n'est mentionnée que par mammadori et aucune autre réponse ne l'emploie.

2
répondu bodo 2018-06-22 21:19:42

j'ai essayé beaucoup d'exemples, mais avec Django mutagène joue bien.

exemple de vérification si les fichiers sont mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

try:
    audio = MP3(file)
except HeaderNotFoundError:
    raise ValidationError('This file should be mp3')

l'inconvénient est que votre capacité à vérifier les types de fichiers est limitée, mais c'est un excellent moyen si vous voulez non seulement vérifier le type de fichier, mais aussi d'accéder à des informations supplémentaires.

0
répondu Artem Bernatskyi 2017-08-19 11:50:06

cela peut être vieux déjà, mais pourquoi ne pas utiliser UploadedFile.content_type directement de Django? N'est pas la même chose?( https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )

0
répondu Gustavo A. Díaz 2017-10-31 14:32:23

pour les données de type byte Array que vous pouvez utiliser magie.from_buffer (_byte_array,mime=True)

0
répondu Ajay 2018-07-25 04:43:28

vous pouvez utiliser imghdr module Python.

-2
répondu jianpx 2012-07-16 10:02:47