Angenommen, Sie möchten eine Reihe von Dateien irgendwo speichern, beispielsweise in BLOBs. Angenommen, Sie möchten diese Dateien über eine Webseite verteilen und den Client automatisch die richtige Anwendung / den richtigen Viewer öffnen lassen.
Annahme: Der Browser ermittelt anhand des MIME-Headers (Inhaltstyp?) In der HTTP-Antwort, welche Anwendung / welcher Viewer verwendet werden soll.
Basierend auf dieser Annahme möchten Sie zusätzlich zu den Bytes der Datei auch den MIME-Typ speichern.
Wie würden Sie den MIME-Typ einer Datei finden? Ich bin derzeit auf einem Mac, aber dies sollte auch unter Windows funktionieren.
Fügt der Browser diese Informationen hinzu, wenn die Datei auf der Webseite veröffentlicht wird?
Gibt es eine ordentliche Python-Bibliothek, um diese Informationen zu finden? Ein WebService oder (noch besser) eine herunterladbare Datenbank?
import magic
aber inkompatible Inhalte. Weitere Informationen finden Sie unter stackoverflow.com/a/16203777/3189 .Das Mimetypes-Modul in der Standardbibliothek ermittelt / errät den MIME-Typ aus einer Dateierweiterung.
Wenn Benutzer Dateien hochladen, enthält der HTTP-Beitrag neben den Daten den MIME-Typ der Datei. Beispielsweise stellt Django diese Daten als Attribut des UploadedFile- Objekts zur Verfügung.
quelle
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(wie in der oberen Antwort vorgeschlagen) noch geringer ist, wie von github.com/s3tools/s3cmd/issues/198 bestätigt . Also,mimetypes
scheint ein besserer Kandidat für mich zu sein.Ein zuverlässigerer Weg als die Verwendung der Mimetypes-Bibliothek wäre die Verwendung des Python-Magic-Pakets.
Dies entspricht der Verwendung von Datei (1).
Auf Django könnte man auch sicherstellen, dass der MIME-Typ mit dem von UploadedFile.content_type übereinstimmt.
quelle
Das scheint sehr einfach zu sein
Bitte beziehen Sie sich auf Old Post
Update - Gemäß dem @ Garrets-Kommentar ist es in Python 3 einfacher:
quelle
Es gibt 3 verschiedene Bibliotheken, die libmagic umschließen.
2 davon sind auf pypi verfügbar (damit die Pip-Installation funktioniert):
Und eine andere, ähnlich wie Python-Magie, ist direkt in den neuesten libmagischen Quellen verfügbar und die, die Sie wahrscheinlich in Ihrer Linux-Distribution haben.
In Debian handelt es sich bei dem Paket python-magic um dieses Paket, das wie oben beschrieben verwendet wird und nicht überholt ist, wie Simon Zimmermann (IMHO) sagte.
Es scheint mir eine andere Einstellung zu sein (vom ursprünglichen Autor von libmagic).
Schade, dass es nicht direkt auf pypi verfügbar ist.
quelle
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
in Python 2.6:
quelle
file
erforderlich , da der Befehl im Grunde nur ein Wrapper um libmagic ist. Sie können auch einfach die Python-Bindung (Python-Magie) verwenden, wie in Simons Antwort.Update 2017
Sie müssen nicht zu Github gehen, es ist auf PyPi unter einem anderen Namen:
Der Code kann ebenfalls vereinfacht werden:
quelle
Python-Bindungen an libmagic
All die unterschiedlichen Antworten zu diesem Thema sind sehr verwirrend, daher hoffe ich, mit diesem Überblick über die verschiedenen Bindungen von libmagic etwas mehr Klarheit zu schaffen. Zuvor gab Mammadori eine kurze Antwort mit der Auflistung der verfügbaren Option.
libmagic
magic
Bei der Bestimmung des MIME-Typs einer Datei wird einfach das Tool Ihrer Wahl aufgerufen
file
und sein Back-End aufgerufenlibmagic
. (Siehe die Projekthomepage .) Das Projekt wird in einem privaten CVS-Repository entwickelt, aber auf Github befindet sich ein schreibgeschützter Git-Spiegel .Dieses Tool, das Sie benötigen, wenn Sie eine der libmagischen Bindungen mit Python verwenden möchten, enthält bereits eigene Python-Bindungen
file-magic
. Es gibt nicht viel dedizierte Dokumentation für sie, aber Sie können immer einen Blick auf die Manpage der C-Bibliothek werfen :man libmagic
. Die grundlegende Verwendung wird in der Readme-Datei beschrieben :Abgesehen davon können Sie die Bibliothek auch verwenden, indem Sie ein
Magic
Objekt erstellen ,magic.open(flags)
wie in der Beispieldatei gezeigt .Sowohl toivotuo als auch ewr2san verwenden diese
file-magic
imfile
Tool enthaltenen Bindungen . Sie nehmen fälschlicherweise an, dass sie daspython-magic
Paket verwenden. Dies scheint darauf hinzudeuten, dass sich das Python-Modul auf das vorherige bezieht , wenn beidefile
undpython-magic
installiert sindmagic
.Python-Magie
magic
Dies ist die Bibliothek, über die Simon Zimmermann in seiner Antwort spricht und die auch von Claude COULOMBE sowie Gringo Suave verwendet wird .
filemagisch
magic
Hinweis : Dieses Projekt wurde zuletzt im Jahr 2013 aktualisiert!
Da diese Bibliothek auf derselben c-api basiert, hat sie eine gewisse Ähnlichkeit mit
file-magic
der inlibmagic
. Es wird nur von Mammadori erwähnt und keine andere Antwort verwendet es.quelle
Die Methode von @toivotuo hat unter python3 für mich am besten und zuverlässigsten funktioniert. Mein Ziel war es, komprimierte Dateien zu identifizieren, die keine zuverlässige .gz-Erweiterung haben. Ich habe python3-magic installiert.
Für eine komprimierte Datei wird Folgendes zurückgegeben: application / gzip; Zeichensatz = binär
für eine entpackte txt-Datei (iostat-Daten): text / plain; Zeichensatz = us-ascii
für eine TAR-Datei: application / x-tar; Zeichensatz = binär
für eine bz2-Datei: application / x-bzip2; Zeichensatz = binär
und zu guter Letzt für mich eine .zip-Datei: application / zip; Zeichensatz = binär
quelle
Sie haben nicht angegeben, welchen Webserver Sie verwendet haben, aber Apache hat ein nettes kleines Modul namens Mime Magic, mit dem Sie den Dateityp bestimmen können, wenn Sie dazu aufgefordert werden. Es liest einen Teil des Dateiinhalts und versucht anhand der gefundenen Zeichen herauszufinden, welcher Typ es ist. Und wie Dave Webb erwähnte, funktioniert das MimeTypes-Modul unter Python, vorausgesetzt, eine Erweiterung ist praktisch.
Wenn Sie auf einer UNIX-Box sitzen, können Sie alternativ
sys.popen('file -i ' + fileName, mode='r')
den MIME-Typ abrufen. Windows sollte einen entsprechenden Befehl haben, aber ich bin mir nicht sicher, was es ist.quelle
Python 3 ref: https://docs.python.org/3.2/library/mimetypes.html
quelle
In Python 3.x und Webapp mit URL zu der Datei, die keine Erweiterung oder eine gefälschte Erweiterung haben konnte. Sie sollten Python-Magic mit installieren
Unter Mac OS X sollten Sie libmagic auch mit installieren
Code-Auszug
Alternativ können Sie eine Größe in den Lesevorgang eingeben
quelle
Ich versuche zuerst die Bibliothek der Mimetypen. Wenn es nicht funktioniert, verwende ich stattdessen Python-Magic Libary.
quelle
Das Mimetypes-Modul erkennt nur einen Dateityp basierend auf der Dateierweiterung. Wenn Sie versuchen, einen Dateityp einer Datei ohne Erweiterung wiederherzustellen, funktionieren die Mimetypen nicht.
quelle
Ich habe viele Beispiele ausprobiert, aber mit Django spielt Mutagen gut.
Beispiel für die Überprüfung, ob Dateien vorhanden sind
mp3
Der Nachteil ist, dass Sie nur begrenzt in der Lage sind, Dateitypen zu überprüfen. Dies ist jedoch eine gute Möglichkeit, wenn Sie nicht nur nach Dateitypen suchen, sondern auch auf zusätzliche Informationen zugreifen möchten.
quelle
Dies mag bereits alt sein, aber warum nicht UploadedFile.content_type direkt von Django aus verwenden? Ist das nicht dasselbe? ( Https://docs.djangoproject.com/de/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
quelle
Für Daten vom Typ Byte-Array können Sie magic.from_buffer (_byte_array, mime = True) verwenden.
quelle
Ich bin überrascht, dass niemand es erwähnt hat, aber Pylements kann eine fundierte Vermutung über den Mimetyp , insbesondere von Textdokumenten , anstellen .
Pylements ist eigentlich eine Python-Syntax-Hervorhebungsbibliothek, verfügt jedoch über eine Methode, mit der Sie genau erraten können, welcher der 500 unterstützten Dokumenttypen Ihr Dokument ist. dh c ++ vs C # vs Python vs etc.
Ausgabe:
Jetzt ist es nicht perfekt, aber wenn Sie feststellen müssen, welches von 500 Dokumentformaten verwendet wird, ist dies verdammt nützlich.
quelle
Sie können das imghdr Python-Modul verwenden.
quelle