Supposons que vous souhaitiez enregistrer un tas de fichiers quelque part, par exemple dans des BLOB. Supposons que vous souhaitiez diffuser ces fichiers via une page Web et que le client ouvre automatiquement l'application / la visionneuse appropriée.
Hypothèse: le navigateur détermine quelle application / quel visualiseur utiliser par l'en-tête mime-type (content-type?) Dans la réponse HTTP.
Sur la base de cette hypothèse, en plus des octets du fichier, vous souhaitez également enregistrer le type MIME.
Comment trouver le type MIME d'un fichier? Je suis actuellement sur un Mac, mais cela devrait également fonctionner sur Windows.
Le navigateur ajoute-t-il ces informations lors de la publication du fichier sur la page Web?
Existe-t-il une bibliothèque python soignée pour trouver ces informations? Un WebService ou (encore mieux) une base de données téléchargeable?
import magic
mais ont un contenu incompatible. Voir stackoverflow.com/a/16203777/3189 pour en savoir plus.Le module mimetypes de la bibliothèque standard déterminera / devinera le type MIME à partir d'une extension de fichier.
Si les utilisateurs téléchargent des fichiers, la publication 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 .
la source
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(comme suggéré dans la réponse du haut) est encore plus faible, comme le confirme github.com/s3tools/s3cmd/issues/198 . Donc,mimetypes
semble un meilleur candidat pour moi.Un moyen plus fiable que d'utiliser la bibliothèque mimetypes serait d'utiliser le paquet python-magic.
Cela équivaudrait à utiliser file (1).
Sur Django, on peut également s'assurer que le type MIME correspond à celui de UploadedFile.content_type.
la source
Cela semble être très facile
Veuillez vous référer à Old Post
Mise à jour - Selon le commentaire @Garrets, dans python 3, c'est plus simple:
la source
Il existe 3 bibliothèques différentes qui encapsulent libmagic.
2 d'entre eux sont disponibles sur pypi (donc l'installation de pip fonctionnera):
Et un autre, similaire à python-magic est disponible directement dans les dernières sources libmagic, et c'est probablement celui que vous avez probablement dans votre distribution Linux.
Dans Debian, le paquet python-magic concerne celui-ci et il est utilisé comme toivotuo l'a dit et il n'est pas obsolète comme l'a dit Simon Zimmermann (IMHO).
Il me semble une autre prise (par l'auteur original de libmagic).
Dommage n'est pas disponible directement sur pypi.
la source
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
en python 2.6:
la source
file
commande n'est en fait qu'un wrapper autour de libmagic. Vous pouvez aussi bien utiliser la liaison python (python-magic), comme dans la réponse de Simon.Mise à jour 2017
Pas besoin d'aller sur github, il est sur PyPi sous un autre nom:
Le code peut également être simplifié:
la source
Liaisons Python avec libmagic
Toutes les différentes réponses sur ce sujet sont très déroutantes, j'espère donc donner un peu plus de clarté avec cet aperçu des différentes liaisons de libmagic. Auparavant, mammadori a donné une brève réponse énumérant l'option disponible.
libmagic
magic
Lors de la détermination d'un fichier de type mime, l'outil de choix est simplement appelé
file
et son back-end est appelélibmagic
. (Voir la page d'accueil du projet .) Le projet est développé dans un référentiel cvs privé, mais il existe un miroir git en lecture seule sur github .Maintenant, cet outil, dont vous aurez besoin si vous souhaitez utiliser l'une des liaisons libmagic avec python, est déjà livré avec ses propres liaisons python appelées
file-magic
. Il n'y a pas beaucoup de documentation dédié pour eux, mais vous pouvez toujours jeter un oeil à la page de manuel de la bibliothèque C:man libmagic
. L'utilisation de base est décrite dans le fichier readme :En dehors de cela, vous pouvez également utiliser la bibliothèque en créant un
Magic
objet en utilisantmagic.open(flags)
comme indiqué dans le fichier d'exemple .Les deux toivotuo et l' utilisation ewr2san ces
file-magic
fixations incluses dans l'file
outil. Ils supposent à tort qu'ils utilisent lepython-magic
package. Cela semble indiquer que si les deuxfile
etpython-magic
sont installés, le module python semagic
réfère à l'ancien.python-magie
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
magic
Remarque : ce projet a été mis à jour pour la dernière fois en 2013!
En raison du fait qu'elle est basée sur le même c-api, cette bibliothèque présente une certaine similitude avec l'
file-magic
inclusion danslibmagic
. Il n'est mentionné que par mammadori et aucune autre réponse ne l'emploie.la source
La méthode de @toivotuo a fonctionné le mieux et la plus fiable pour moi sous python3. Mon objectif était d'identifier les fichiers gzippés qui n'ont pas d'extension .gz fiable. J'ai installé python3-magic.
pour un fichier gzip, il renvoie: application / gzip; charset = binaire
pour un fichier txt décompressé (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 enfin et surtout pour moi un fichier .zip: application / zip; charset = binaire
la source
python 3 réf: https://docs.python.org/3.2/library/mimetypes.html
la source
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 une partie du contenu du fichier et essaie de déterminer de quel type il s'agit en fonction des caractères trouvés. Et comme Dave Webb l'a mentionné, le module MimeTypes sous python fonctionnera, à condition qu'une extension soit pratique.
Sinon, 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.la source
En Python 3.x et webapp avec l'URL du fichier qui ne peut pas avoir d'extension ou de fausse extension. Vous devez installer python-magic, en utilisant
Pour Mac OS X, vous devez également installer libmagic en utilisant
Extrait de code
Sinon, vous pouvez mettre une taille dans la lecture
la source
J'essaye d'abord la bibliothèque de types mimetypes. Si cela ne fonctionne pas, j'utilise la librairie python-magic à la place.
la source
Le module mimetypes reconnaît simplement un type de fichier basé sur l'extension de fichier. Si vous essayez de récupérer un type de fichier d'un fichier sans extension, les types MIME ne fonctionneront pas.
la source
Je suis surpris que personne ne l'ait mentionné, mais Pygments est capable de faire une supposition éclairée sur le type mime, en particulier, des documents texte.
Pygments est en fait une bibliothèque de coloration syntaxique Python, mais possède une méthode qui permet de deviner de manière éclairée le type de document pris en charge sur 500 de votre document. ie c ++ vs C # vs Python vs etc
Production:
Maintenant, ce n'est pas parfait, mais si vous avez besoin de savoir lequel des 500 formats de document est utilisé, c'est sacrément utile.
la source
J'ai essayé beaucoup d 'exemples mais avec Django, mutagen joue bien.
Exemple de vérification si les fichiers sont
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 souhaitez non seulement vérifier le type de fichier, mais également accéder à des informations supplémentaires.
la source
Cela peut déjà être ancien, mais pourquoi ne pas utiliser UploadedFile.content_type directement depuis Django? N'est-ce pas pareil? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
la source
Pour les données de type byte Array, vous pouvez utiliser magic.from_buffer (_byte_array, mime = True)
la source
vous pouvez utiliser le module imghdr Python.
la source