Powiedzmy, że chcesz gdzieś zapisać kilka plików, na przykład w BLOBach. Powiedzmy, że chcesz udostępnić te pliki za pośrednictwem strony internetowej i pozwolić klientowi automatycznie otworzyć poprawną aplikację / przeglądarkę.
Założenie: przeglądarka ustala, która aplikacja / przeglądarka ma użyć nagłówka mime-type (content-type?) W odpowiedzi HTTP.
Opierając się na tym założeniu, oprócz bajtów pliku, chcesz również zapisać typ MIME.
Jak znajdziesz typ pliku MIME? Jestem obecnie na komputerze Mac, ale powinno to również działać w systemie Windows.
Czy przeglądarka dodaje tę informację podczas publikowania pliku na stronie internetowej?
Czy jest fajna biblioteka Pythona do wyszukiwania tych informacji? WebService lub (jeszcze lepiej) baza danych do pobrania?
import magic
ale mają niezgodne treści. Aby uzyskać więcej informacji, zobacz stackoverflow.com/a/16203777/3189 .W MIMETYPES moduł w bibliotece standardowej zadecyduje / odgadnąć typ MIME z rozszerzeniem pliku.
Jeśli użytkownicy przesyłają pliki, post HTTP będzie zawierał typ MIME pliku obok danych. Na przykład Django udostępnia te dane jako atrybut obiektu UploadedFile .
źródło
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(jak sugerowano w górnej odpowiedzi) jest jeszcze niższa, co potwierdza github.com/s3tools/s3cmd/issues/198 . Tak więc,mimetypes
wydaje się lepszym kandydatem do mnie.Bardziej niezawodnym sposobem niż użycie biblioteki mimetypes byłoby użycie pakietu python-magic.
Byłoby to równoważne z użyciem file (1).
W Django można również upewnić się, że typ MIME jest zgodny z typem UploadedFile.content_type.
źródło
To wydaje się bardzo łatwe
Proszę odnieś się Old Post
Aktualizacja - zgodnie z komentarzem @Garrets w Pythonie 3 jest to prostsze:
źródło
Istnieją 3 różne biblioteki, które zawierają libmagic.
2 z nich są dostępne na pypi (więc instalacja pip będzie działać):
Kolejny, podobny do python-magic, jest dostępny bezpośrednio w najnowszych źródłach libmagic i jest to ten, który prawdopodobnie masz w swojej dystrybucji linux.
W Debianie pakiet o python-magic dotyczy właśnie tego i jest używany jako toivotuo powiedział i nie jest przestarzały, jak powiedział Simon Zimmermann (IMHO).
Wydaje mi się, że to kolejne ujęcie (autorstwa oryginalnego autora libmagic).
Szkoda, że nie jest dostępny bezpośrednio na pypi.
źródło
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
w Pythonie 2.6:
źródło
file
polecenie to po prostu opakowanie na libmagic. Równie dobrze możesz użyć wiązania python (python-magic), jak w odpowiedzi Simona.Aktualizacja 2017
Nie musisz iść do github, jest na PyPi pod inną nazwą:
Kod można również uprościć:
źródło
Powiązania Pythona z libmagic
Wszystkie różne odpowiedzi na ten temat są bardzo mylące, więc mam nadzieję, że dam nieco więcej jasności dzięki przeglądowi różnych powiązań libmagic. Wcześniej mammadori udzielił krótkiej odpowiedzi listą dostępnej opcji.
libmagic
magic
Podczas określania typu pliku MIME wybrane narzędzie jest po prostu wywoływane
file
i wywoływane jest jego zapleczelibmagic
. (Zobacz stronę główną projektu .) Projekt jest rozwijany w prywatnym repozytorium cvs, ale na github znajduje się tylko do odczytu mirror git .Teraz to narzędzie, które będzie potrzebne, jeśli chcesz używać dowolnego z powiązań libmagic z pythonem, ma już swoje własne, zwane powiązania z pythonem
file-magic
. Nie ma zbyt wiele dedykowana dokumentacja dla nich, ale zawsze można rzucić okiem na stronę man c-biblioteki:man libmagic
. Podstawowe użycie opisano w pliku readme :Oprócz tego możesz również korzystać z biblioteki, tworząc
Magic
obiekt za pomocą,magic.open(flags)
jak pokazano w przykładowym pliku .Zarówno toivotuo, jak i ewr2san używają tych
file-magic
wiązań zawartych wfile
narzędziu. Błędnie zakładają, że używająpython-magic
pakietu. Wydaje się to wskazywać, że jeśli obafile
ipython-magic
są instalowane, moduł pythonmagic
odnosi się do tej pierwszej.python-magic
magic
Jest to biblioteka, o której mówi Simon Zimmermann w swojej odpowiedzi i która jest również wykorzystywana przez Claude'a COULOMBE, a także Gringo Suave .
filemagiczny
magic
Uwaga : ten projekt został ostatnio zaktualizowany w 2013 roku!
Ponieważ ta biblioteka oparta jest na tym samym c-api, ma pewne podobieństwo z
file-magic
zawartą wlibmagic
. Wspomina o tym tylko mammadori i żadna inna odpowiedź go nie stosuje.źródło
Metoda @toivotuo działała najlepiej i najbardziej niezawodnie dla mnie w Python3. Moim celem było zidentyfikowanie plików spakowanych gzip, które nie mają niezawodnego rozszerzenia .gz. Zainstalowałem Python3-Magic.
dla pliku spakowanego gzipem zwraca: application / gzip; charset = binarny
dla rozpakowanego pliku txt (dane iostat): text / plain; charset = us-ascii
dla pliku tar: application / x-tar; charset = binarny
dla pliku bz2: application / x-bzip2; charset = binarny
i dla mnie wreszcie plik .zip: application / zip; charset = binarny
źródło
python 3 ref: https://docs.python.org/3.2/library/mimetypes.html
źródło
Nie określiłeś, jakiego serwera używasz, ale Apache ma ładny mały moduł o nazwie Mime Magic, którego używa do określania typu pliku, gdy zostanie o to poproszony. Odczytuje część zawartości pliku i próbuje dowiedzieć się, jakiego typu jest on na podstawie znalezionych znaków. I jak Dave Webb Wspomniany przez MIMETYPES modułu pod pytona będzie działać pod warunkiem, rozszerzenie jest poręczny.
Alternatywnie, jeśli siedzisz na pudełku UNIX, możesz użyć
sys.popen('file -i ' + fileName, mode='r')
do przechwycenia typu MIME. Windows powinien mieć równoważne polecenie, ale nie jestem pewien, co to jest.źródło
W Pythonie 3.x i aplikacji internetowej z adresem URL do pliku, który nie może mieć rozszerzenia ani fałszywego rozszerzenia. Powinieneś zainstalować Python-Magic, używając
W systemie Mac OS X należy również zainstalować libmagic przy użyciu
Fragment kodu
alternatywnie możesz wstawić rozmiar do odczytu
źródło
Najpierw próbuję biblioteki mimetypes. Jeśli to nie działa, używam zamiast tego biblioteki python-magic.
źródło
Moduł mimetypes po prostu rozpoznaje typ pliku na podstawie rozszerzenia pliku. Jeśli spróbujesz odzyskać typ pliku bez rozszerzenia, typy MIME nie będą działać.
źródło
Dziwię się, że nikt o tym nie wspominał, ale Pygments potrafi zgadywać na temat typu mimów, szczególnie dokumentów tekstowych.
Pygments to tak naprawdę biblioteka do podświetlania składni Pythona, ale ma metodę, która pozwoli odgadnąć, który z 500 obsługiwanych typów dokumentów jest twoim dokumentem. tj. c ++ vs C # vs Python vs itp
Wynik:
Teraz nie jest idealny, ale jeśli chcesz wiedzieć, który z 500 formatów dokumentów jest używany, jest to bardzo przydatne.
źródło
Próbowałem wielu przykładów, ale z mutagenem Django gra się ładnie.
Przykład sprawdzania, czy pliki są
mp3
Minusem jest to, że możliwość sprawdzania typów plików jest ograniczona, ale jest to świetny sposób, jeśli chcesz nie tylko sprawdzić typ pliku, ale także uzyskać dostęp do dodatkowych informacji.
źródło
To może być już stare, ale dlaczego nie użyć UploadedFile.content_type bezpośrednio z Django? Czy to nie to samo? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
źródło
W przypadku danych typu Array bajtów można użyć magic.from_buffer (_byte_array, mime = True)
źródło
możesz użyć modułu imghdr Python.
źródło