Nasıl Python bir dosyanın MIME türü bulunur?

oy
133

Diyelim ki BLOB'lar örneğin bir yere dosyaların bir demet kaydetmek istediğimizi varsayalım. Diyelim ki bir web sayfası üzerinden bu dosyaları saçmak isteyen ve istemci otomatik olarak doğru uygulama / görüntüleyiciyi açın var diyelim.

Varsayım: tarayıcı HTTP yanıt olarak MIME türü (? Içerik tipi) başlığı ile kullanılacak uygulama / izleyici çözmek için kullanılır.

varsayımına dayanarak, dosyanın bayt ek olarak, ayrıca MIME türünü kurtarmak istiyorum.

Nasıl bir dosyanın MIME türü bulur? Bir Mac üzerinde şu anda değilim, ama bu aynı zamanda Windows üzerinde çalışması gerekir.

Web sayfasına dosyayı gönderirken tarayıcı bu bilgileri eklemek mu?

Bu bilgileri bulmak için düzgün bir piton kütüphane var? Bir WebService veya (daha iyi) indirilebilir bir veritabanı?

Oluştur 04/09/2008 saat 13:07
kaynak kullanıcı
Diğer dillerde...                            


19 cevaplar

oy
68

Mimetypes modül / belirleyecek standart kütüphanede bir dosya uzantısından MIME türü sanırım.

Kullanıcıların dosyaları yüklüyorsanız HTTP sonrası verilerinin yanında dosyanın MIME türü içerecektir. Örneğin, Django bir özelliği olarak, bu veriler hale uploadedfile nesne.

Cevap 04/09/2008 saat 13:12
kaynak kullanıcı

oy
6

Sen kullandığınız hangi web sunucusu devlet yoktu, ama Apache adlı güzel küçük modülüne sahip Mim Magic bunu yapmak için söyledim bir dosyanın türünü belirlemek için kullanır. Bu dosyanın içeriğinin bazı okur ve buldum karakterler dayanmaktadır tip anlamaya çalışır. Ve Dave Webb Söz MimeTypes Modülü piton altında çalışacak, bir uzantısı kullanışlı sağladı.

Eğer bir UNIX paketlerinden oturuyor Alternatif olarak, kullanabileceğiniz sys.popen('file -i ' + fileName, mode='r')MIME türünü kapmak için. , Windows eşdeğer bir komutu olmalıdır, ancak bunun ne olarak emin değilim.

Cevap 04/09/2008 saat 13:22
kaynak kullanıcı

oy
8

piton 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
Cevap 02/11/2009 saat 16:48
kaynak kullanıcı

oy
41

piton-sihirli paketi kullanmak olacaktır mimetypes kütüphane kullanımı daha güvenilir bir yol.

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

Bu dosya (1) kullanmaya eşdeğer olacaktır.

Django üzerinde bir de MIME türü UploadedFile.content_type ile uyuştuğunu emin olabilir.

Cevap 25/01/2010 saat 17:39
kaynak kullanıcı

oy
157

Toivotuo önerdiği piton-sihirli yöntem eskidir. Python-magic'in şimdiki gövde Github altındadır ve MIME türünü bulma orada Benioku'da dayalı, böyle yapılır.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
Cevap 02/05/2010 saat 13:02
kaynak kullanıcı

oy
-2

Kullanabileceğiniz imghdr Python modülü.

Cevap 23/05/2012 saat 05:37
kaynak kullanıcı

oy
3

mimetypes modülü sadece dosya uzantısına göre bir dosya türünü tanır. Eğer uzantısı olmadan bir dosyanın dosya türünü kurtarmak için çalışacağız ise mimetypes eserler olmaz.

Cevap 19/06/2012 saat 13:51
kaynak kullanıcı

oy
9

Libmagic sarar 3 farklı kütüphaneler vardır.

Bunlardan 2 (şimdiye çalışacaktır yüklemek pip) pypi bulunmaktadır:

  • filemagic
  • piton-büyü

Ve bir başka, piton-büyü benzer son Libmagic kaynaklarında doğrudan mevcut olduğunu ve muhtemelen linux dağıtımında var biridir.

Debian paket piton-büyü hakkında bu bir ve toivotuo dediği gibi kullanılır ve Simon Zimmermann (IMHO) dediği gibi obsoleted edilmez.

Bana (Libmagic orijinal yazar tarafından) Başka bir take görünüyor.

Çok kötü doğrudan pypi kullanılamaz.

Cevap 06/09/2012 saat 11:22
kaynak kullanıcı

oy
21

Bu çok kolay gibi görünüyor

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

Bakınız Eski Yayınla

Cevap 13/02/2014 saat 14:09
kaynak kullanıcı

oy
5

@toivotuo 'ın yöntemi python3 altında benim için en iyi ve en güvenilir şekilde çalıştı. Amacım güvenilir .gz uzantısı yok gzip'lenmiş dosyalarını belirlemekti. Ben python3-büyü yüklü.

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

gzip dosyası için döndürür: application / gzip; charset = ikili

(Veri iostat) bir Açılmış txt dosyası: yazı / düz; charset = bize ascii

Bir katran dosya: uygulama / x-katran; charset = ikili

Bir bz2 dosya: uygulama / x-bzip2; charset = ikili

ve son ama benim bir .zip dosyası için en az: application / zip; charset = ikili

Cevap 03/02/2015 saat 19:09
kaynak kullanıcı

oy
4

bir uzantısı veya sahte uzantısına sahip olamazdı dosyaya url ile Python 3.x ve webapp. Sen kullanarak, piton-sihirli yüklemelisiniz

pip3 install python-magic

Mac OS X için, ayrıca kullanarak Libmagic yüklemelisiniz

brew install libmagic

Kod pasajı

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)

Alternatif olarak okuma içine bir boyut koyabilirsiniz

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)
Cevap 06/09/2016 saat 19:55
kaynak kullanıcı

oy
0

Django örnekler fakat çok denedim mutajendir güzel oynar.

dosyalar ise Örnek denetleme mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

Olumsuz dosya türlerini kontrol etmek için yeteneği sınırlı olduğunu, ancak sadece dosya türü için onay istemiyorsunuz ve aynı zamanda ek bilgilere erişmek için eğer harika bir yoldur.

Cevap 19/08/2017 saat 10:33
kaynak kullanıcı

oy
2

2017 Güncelleme

github gitmeye gerek yok, farklı bir isim altında PyPi üzerindedir:

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

kod yanı kolaylaştırılabilir:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'
Cevap 15/10/2017 saat 19:09
kaynak kullanıcı

oy
0

Bu zaten eski olabilir ama neden Django doğrudan UploadedFile.content_type kullanamaz? Aynı değil midir? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )

Cevap 31/10/2017 saat 14:32
kaynak kullanıcı

oy
1

Python bağlantıları Libmagic için

Bu konuyla ilgili tüm farklı cevaplar çok kafa karıştırıcı, bu yüzden Libmagic farklı bağlamaları bu bakış ile biraz daha fazla netlik vermek için umut ediyorum. Daha önce mammadori bir verdi kısa bir cevap mevcut seçeneği listeleme.

Libmagic

Bir dosya mim tipi belirlerken, seçim aracı basitçe denir fileve arka uç denir libmagic. (Bkz Proje ana sayfa proje özel cvs-depoda geliştirilmiştir.), Ancak bir orada salt okunur git ayna üzerinde github .

Şimdi python ile Libmagic bağlamaları herhangi birini kullanmak istiyorsanız ihtiyacınız olacak bu araç, zaten denilen kendi piton bağları ile gelir file-magic. Orada onlar için çok özel belgeler değil, ama her zaman c-kütüphane adam sayfasına bir göz olabilir: man libmagic. Temel kullanım açıklanan beni oku dosyasında :

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)

Bunun dışında, ayrıca bir oluşturarak kütüphane kullanabilirsiniz Magickullanarak nesneyi magic.open(flags)gösterildiği gibi örnek bir dosya .

Hem toivotuo ve ewr2san bu kullanmak file-magicdahil bağlantıları filearacı. Onlar yanlışlıkla kullandıkları, farz python-magicpaketi. Bu, her iki takdirde, işaret gibi görünüyor fileve python-magicyüklü, piton modülü magicöncekine ifade eder.

piton-büyü

Bu Simon Zimmermann içinde bahsediyor kütüphanesidir onun cevabını da tarafından kullanılır ve Claude Coulombe yanı sıra Gringo Suave .

filemagic

Not : Bu proje son 2013 yılında güncellendi!

Aynı c-API dayalı olması nedeniyle, bu kütüphane ile bazı benzerlikleri vardır file-magicdahil libmagic. Sadece tarafından belirtilen mammadori ve başka hiçbir cevap onu kullanır.

Cevap 22/06/2018 saat 10:25
kaynak kullanıcı

oy
0

bayt Dizi türü veriler için size magic.from_buffer kullanabilirsiniz (_byte_array, mim = True)

Cevap 25/07/2018 saat 04:43
kaynak kullanıcı

oy
0

Ben ilk mimetypes kütüphane deneyin. işe yaramıyor, ben yerine piton-sihirli kitaplığındaki kullanın.

import mimetypes
def guess_type(filename, buffer=None):
mimetype, encoding = mimetypes.guess_type(filename)
if mimetype is None:
    try:
        import magic
        if buffer:
            mimetype = magic.from_buffer(buffer, mime=True)
        else:
            mimetype = magic.from_file(filename, mime=True)
    except ImportError:
        pass
return mimetype
Cevap 22/05/2019 saat 04:18
kaynak kullanıcı

oy
0

piton 3 ref: https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type (url = sıkı True) url tarafından verilen bunun dosya veya URL'ye dayalı bir dosya türünü, sanırım. dönüş değeri (eksik veya bilinmeyen ek) tipi tahmin edilemez, tip Yok olan demet (tip kodlama) ya da bir MIME türü başlığının kullanılabilir bir şekilde 'tipi / alt tipi', bir dizidir.

kodlayan (örneğin sıkıştırma veya gzip) bir kodlama veya kodlamak için kullanılan program adı None. Kodlama bir içerik-Transfer-Encoding başlığı olarak bir içerik-kodlama başlığı olarak kullanım için uygundur. eşleştirmeleri tablo tahrik vardır. Kodlama ekleri durumda duyarlıdır; tip ekleri ilk duyarsızca sonra, hassas case büyük çalışılmaktadır.

Opsiyonel sıkı argüman bilinen MIME türlerinin listesi IANA'da kayıtlı sadece resmi türlerine sınırlı olup olmadığını belirten bir bayrak. Sıkı (varsayılan) Doğru olduğunda, sadece IANA türleri desteklenir; Sıkı Yanlış olduğunda, bazı standart dışı ek ancak yaygın olarak kullanılan MIME türleri de tanınır.

import mimetypes
print(mimetypes.guess_type("sample.html"))
Cevap 15/09/2019 saat 08:05
kaynak kullanıcı

oy
0

Yorum eklemek Could, ben yeniyim.

Kullanırım:

import magic
mime = magic.Magic(mime=True)
mime.from_file("mypath/myfile.mkv")

o "inode / blockdevice" bildiriyor 2 GB üzerinde video dosyalarının dışında hangi çalışır. MediaInfo bana dosyaları normal bilgi verir. videolar da vlc doğru oynarlar.

Bu neyin sebep olduğu emin değilim.

Windows 10 pro v1903 x64, piton 3.7.4

Cevap 20/12/2019 saat 20:52
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more