Katakanlah Anda ingin menyimpan banyak file di suatu tempat, misalnya di BLOB. Katakanlah Anda ingin mengeluarkan file-file ini melalui halaman web dan klien secara otomatis membuka aplikasi / penampil yang benar.
Asumsi: Peramban mengetahui aplikasi / penampil mana yang akan digunakan oleh header tipe-mime (tipe-konten?) Dalam respons HTTP.
Berdasarkan asumsi itu, selain byte file, Anda juga ingin menyimpan tipe MIME.
Bagaimana Anda menemukan jenis file MIME? Saya saat ini menggunakan Mac, tetapi ini juga harus bekerja pada Windows.
Apakah browser menambahkan informasi ini ketika memposting file ke halaman web?
Apakah ada perpustakaan python yang rapi untuk menemukan informasi ini? Layanan Web atau (bahkan lebih baik) database yang dapat diunduh?
import magic
tetapi memiliki konten yang tidak kompatibel. Lihat stackoverflow.com/a/16203777/3189 untuk lebih lanjut.The Mimetypes modul di perpustakaan standar akan menentukan / menebak tipe MIME dari ekstensi file.
Jika pengguna mengunggah file, posting HTTP akan berisi tipe MIME dari file di samping data. Misalnya, Django membuat data ini tersedia sebagai atribut dari objek UploadedFile .
sumber
import mimetypes
mimetypes.MimeTypes().guess_type(filename)[0]
mimetypes.guess_type(path_file_to_upload)[1]
python-magic
(seperti yang disarankan dalam jawaban atas) menjadi lebih rendah, seperti yang dikonfirmasi oleh github.com/s3tools/s3cmd/issues/198 . Jadi,mimetypes
sepertinya kandidat yang lebih baik untuk saya.Cara yang lebih andal daripada menggunakan mimetypes library adalah dengan menggunakan paket python-magic.
Ini akan setara dengan menggunakan file (1).
Pada Django kita juga bisa memastikan bahwa tipe MIME cocok dengan yang diunggah dari UploadedFile.content_type.
sumber
Ini tampaknya sangat mudah
Silakan merujuk Old Post
Perbarui - Sesuai komentar @Garrets, Dalam python 3 lebih mudah:
sumber
Ada 3 perpustakaan berbeda yang membungkus libmagic.
2 di antaranya tersedia di pypi (jadi instalasi pip akan berfungsi):
Dan yang lain, mirip dengan python-magic tersedia langsung di sumber libmagic terbaru, dan itu adalah yang mungkin Anda miliki dalam distribusi linux Anda.
Dalam Debian paket python-magic adalah tentang yang satu ini dan digunakan seperti kata toivotuo dan tidak usang seperti kata Simon Zimmermann (IMHO).
Sepertinya saya ambil lagi (oleh penulis asli libmagic).
Sayang sekali tidak tersedia langsung di pypi.
sumber
pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
dalam python 2.6:
sumber
file
perintah pada dasarnya hanyalah pembungkus libmagic. Anda mungkin juga hanya menggunakan penjilidan python (python-magic), seperti dalam jawaban Simon.Pembaruan 2017
Tidak perlu pergi ke github, itu di PyPi dengan nama yang berbeda:
Kode dapat disederhanakan juga:
sumber
Binding Python untuk libmagic
Semua jawaban yang berbeda pada topik ini sangat membingungkan, jadi saya berharap untuk memberikan sedikit lebih banyak kejelasan dengan ikhtisar ini tentang berbagai ikatan libmagic. Sebelumnya mammadori memberi jawaban singkat mencantumkan opsi yang tersedia.
libmagic
magic
Saat menentukan jenis file mime, alat pilihan dipanggil
file
dan back-endnya disebutlibmagic
. (Lihat halaman depan Proyek .) Proyek ini dikembangkan di repositori cvs pribadi, tetapi ada mirror git read-only di github .Sekarang alat ini, yang akan Anda perlukan jika Anda ingin menggunakan binding libmagic dengan python, sudah dilengkapi dengan binding python sendiri yang disebut
file-magic
. Tidak ada banyak dokumentasi yang didedikasikan untuk mereka, tetapi Anda selalu dapat kita lihat pada halaman manual dari c-library:man libmagic
. Penggunaan dasar dijelaskan dalam file readme :Selain itu, Anda juga dapat menggunakan perpustakaan dengan membuat
Magic
objek menggunakanmagic.open(flags)
seperti yang ditunjukkan pada file contoh .Baik toivotuo dan ewr2san menggunakan
file-magic
binding ini termasuk dalamfile
alat. Mereka keliru menganggap, mereka menggunakanpython-magic
paket itu. Ini tampaknya menunjukkan, bahwa jika keduanyafile
danpython-magic
diinstal, modul pythonmagic
merujuk ke yang sebelumnya.python-magic
magic
Ini adalah perpustakaan yang dibicarakan Simon Zimmermann dalam jawabannya dan yang juga digunakan oleh Claude COULOMBE serta Gringo Suave .
filemagis
magic
Catatan : Proyek ini terakhir diperbarui pada 2013!
Karena didasarkan pada c-api yang sama, perpustakaan ini memiliki beberapa kesamaan dengan yang
file-magic
termasuk dalamlibmagic
. Itu hanya disebutkan oleh mammadori dan tidak ada jawaban lain yang mempekerjakannya.sumber
Metode @toivotuo bekerja paling baik dan paling andal bagi saya di bawah python3. Tujuan saya adalah mengidentifikasi file gzip yang tidak memiliki ekstensi .gz yang andal. Saya menginstal python3-magic.
untuk file yang gzip dikembalikan: application / gzip; charset = biner
untuk file txt yang tidak di-zip (data iostat): text / plain; charset = us-ascii
untuk file tar: application / x-tar; charset = biner
untuk file bz2: application / x-bzip2; charset = biner
dan yang tak kalah pentingnya bagi saya file .zip: application / zip; charset = biner
sumber
python 3 ref: https://docs.python.org/3.2/library/mimetypes.html
sumber
Anda tidak menyatakan server web apa yang Anda gunakan, tetapi Apache memiliki modul kecil yang bagus yang disebut Mime Magic yang digunakannya untuk menentukan jenis file ketika disuruh melakukannya. Itu membaca beberapa konten file dan mencoba untuk mencari tahu jenis apa itu berdasarkan karakter yang ditemukan. Dan sebagai Dave Webb Disebutkan dalam Mimetypes Modul di bawah python akan bekerja, memberikan perpanjangan berguna.
Atau, jika Anda duduk di kotak UNIX, Anda dapat menggunakan
sys.popen('file -i ' + fileName, mode='r')
untuk mengambil jenis MIME. Windows seharusnya memiliki perintah yang setara, tetapi saya tidak yakin apa itu.sumber
Dalam Python 3.x dan webapp dengan url ke file yang tidak dapat memiliki ekstensi atau ekstensi palsu. Anda harus menginstal python-magic, menggunakan
Untuk Mac OS X, Anda juga harus menginstal libmagic menggunakan
Cuplikan kode
atau Anda bisa memasukkan ukuran ke dalam bacaan
sumber
Saya mencoba meniru perpustakaan terlebih dahulu. Jika tidak berhasil, saya menggunakan perpustakaan python-magic.
sumber
Modul mimetypes hanya mengenali tipe file berdasarkan ekstensi file. Jika Anda akan mencoba memulihkan jenis file tanpa ekstensi, mimetypes tidak akan berfungsi.
sumber
Saya terkejut bahwa tidak ada yang menyebutkannya, tetapi Pygments mampu membuat tebakan yang berpendidikan tentang jenis teks pantomim, khususnya, dokumen teks.
Pygments sebenarnya adalah pustaka sintaksis Python tetapi memiliki metode yang akan membuat tebakan berpendidikan tentang mana dari 500 jenis dokumen yang didukung dokumen Anda. yaitu c ++ vs C # vs Python vs dll
Keluaran:
Sekarang, ini tidak sempurna, tetapi jika Anda harus tahu dari 500 format dokumen yang digunakan, ini sangat berguna.
sumber
Saya sudah mencoba banyak contoh tetapi dengan Django mutagen bermain bagus.
Contoh memeriksa apakah file
mp3
Kelemahannya adalah kemampuan Anda untuk memeriksa jenis file terbatas, tetapi ini merupakan cara yang bagus jika Anda ingin tidak hanya memeriksa jenis file tetapi juga untuk mengakses informasi tambahan.
sumber
Ini mungkin sudah lama, tetapi mengapa tidak menggunakan UploadedFile.content_type langsung dari Django? Tidak sama? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )
sumber
Untuk data jenis byte Array, Anda dapat menggunakan magic.from_buffer (_byte_array, mime = True)
sumber
Anda dapat menggunakan modul Python imghdr .
sumber