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?
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'
>>>
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 .
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.
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
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.
en python 2.6:
mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
stdout=subprocess.PIPE).communicate()[0]
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.
@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
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)
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.
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'
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
- nom du module:
magic
- pypi: fichier-magic
- source: https://github.com/file/file/tree/master/python
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
- nom du module:
magic
- pypi: python-magie
- source: https://github.com/ahupp/python-magic
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
- nom du module:
magic
- pypi: filemagic
- source: https://github.com/aliles/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.
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.
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 )
pour les données de type byte Array que vous pouvez utiliser magie.from_buffer (_byte_array,mime=True)