अजगर में फ़ाइल का माइम प्रकार कैसे ढूंढें?


194

मान लीजिए कि आप फ़ाइलों का एक गुच्छा बचाना चाहते हैं, उदाहरण के लिए BLOB में। मान लें कि आप इन फ़ाइलों को एक वेब पेज के माध्यम से बाहर करना चाहते हैं और क्लाइंट के पास सही एप्लिकेशन / दर्शक को स्वचालित रूप से खोलना है।

धारणा: ब्राउज़र प्रतिसाद देता है कि कौन सी एप्लिकेशन / दर्शक माइम-टाइप (सामग्री-प्रकार?) का उपयोग करके HTTP प्रतिक्रिया में है।

उस धारणा के आधार पर, फ़ाइल के बाइट्स के अलावा, आप MIME प्रकार को भी सहेजना चाहते हैं।

आपको MIME प्रकार की फ़ाइल कैसे मिलेगी? मैं वर्तमान में एक मैक पर हूँ, लेकिन यह भी विंडोज पर काम करना चाहिए।

क्या वेब पेज पर फ़ाइल पोस्ट करते समय ब्राउज़र इस जानकारी को जोड़ता है?

क्या इस जानकारी को खोजने के लिए एक स्वच्छ अजगर पुस्तकालय है? एक WebService या (और भी बेहतर) एक डाउनलोड करने योग्य डेटाबेस?

जवाबों:


218

टुट्टुओ द्वारा सुझाई गई अजगर-जादू पद्धति पुरानी है। पाइथन-मैजिक का करंट ट्रंक गितुब में है और वहां की रीमेक के आधार पर, MIME- टाइप को खोजकर इस तरह किया जाता है।

# For MIME types
import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'

17
टिप्पणी के लिए धन्यवाद! कृपया ध्यान दें, "ऊपर" स्टैकओवरफ्लो में एक कठिन अवधारणा है, क्योंकि ऑर्डर को वोटों द्वारा समूहीकृत किया जाता है और समूहों के अंदर बेतरतीब ढंग से ऑर्डर किया जाता है। मैं अनुमान लगा रहा हूं कि आप @ toivotuo के उत्तर को देखें।
डैरन थॉमस

1
हां, मैंने इस उत्तर को लिखने के समय टिप्पणी बनाने के लिए पर्याप्त "अंक" नहीं दिए हैं। लेकिन मुझे शायद इसे एक टिप्पणी के रूप में लिखना चाहिए था, ताकि @toivotuo अपने प्रश्न को संपादित कर सके।
साइमन ज़िम्मरमैन

1
rpm -qf /usr/lib/python2.7/site-packages/magic.py -i URL: darwinsys.com/file सारांश : कामेच्छा के लिए पायथन बाइंडिंग API rpm -qf / usr / bin / file -i नाम: फ़ाइल URL: darwinsys.com/file python-Magic from darwinsys.com/file और जो लिनक्स फेडोरा के साथ आता है, वह @ toivotuo की तरह काम करता है। और अधिक मुख्य धारा लगती है।
Sérgio

7
खबरदार कि पायथन-मैजिक नामक डेबियन / ubuntu पैकेज एक ही नाम के पाइप पैकेज के लिए अलग है। दोनों में import magicअसंगत सामग्री है। अधिक देखने के लिए stackoverflow.com/a/16203777/3189 देखें ।
हामिश डाउनर

1
जैसा कि मैंने toflowuo के जवाब पर टिप्पणी की, यह पुराना नहीं है! आप एक अलग पुस्तकालय के बारे में बात कर रहे हैं। क्या आप अपने उत्तर में उस कथन को हटा या बदल सकते हैं? यह वर्तमान में सबसे अच्छा समाधान खोजने के लिए वास्तव में मुश्किल बनाता है।
बोडो

87

Mimetypes मॉड्यूल मानक पुस्तकालय में निर्धारित / एक फाइल एक्सटेंशन से MIME प्रकार लगता है कि होगा।

यदि उपयोगकर्ता फाइलें अपलोड कर रहे हैं तो HTTP पोस्ट में डेटा के साथ-साथ MIME प्रकार की फाइल होगी। उदाहरण के लिए, Django इस डेटा को UploadedFile ऑब्जेक्ट की विशेषता के रूप में उपलब्ध कराता है ।


12
यदि फ़ाइलों को BLOB में संग्रहीत किया जाता है, जैसा कि प्रश्न में निर्दिष्ट है, तो आप फ़ाइल एक्सटेंशन को नहीं जान सकते हैं।
मैकेनिकल घोंघा

55
फ़ाइल एक्सटेंशन माइम प्रकार निर्धारित करने के लिए एक विश्वसनीय तरीका नहीं है।
सेरिन

13
import mimetypes mimetypes.MimeTypes().guess_type(filename)[0]
जोनाथन

4
अजगर 3.6 में यह काम करता है:mimetypes.guess_type(path_file_to_upload)[1]
जिंसावे

3
जबकि @cerin सही है कि फ़ाइल एक्सटेंशन विश्वसनीय नहीं हैं, मैंने अभी पता लगाया है कि python-magic(शीर्ष उत्तर में सुझाई गई) की सटीकता भी कम है, जैसा कि github.com/s3tools/s3cmd/issues/198 द्वारा पुष्टि की गई है । इसलिए, mimetypesमेरे लिए बेहतर उम्मीदवार हैं।
डैनिक्विक

46

मैमटाइप्स लाइब्रेरी का उपयोग करने की तुलना में अधिक विश्वसनीय तरीका पायथन-मैजिक पैकेज का उपयोग करना होगा।

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

यह फ़ाइल (1) का उपयोग करने के बराबर होगा।

Django पर यह भी सुनिश्चित कर सकता है कि MIME प्रकार UploadedFile.content_type से मेल खाता है।


2
अजगर-जादू के अद्यतन उपयोग के लिए साइमन ज़िमरमन की पोस्ट देखें
डैरन थॉमस

@DarenThomas: जैसा कि स्तनधारी के उत्तर में उल्लेख किया गया है, यह उत्तर पुराना नहीं है और साइमन ज़िमरमन के समाधान से अलग है। यदि आपके पास फ़ाइल उपयोगिता स्थापित है, तो आप शायद इस समाधान का उपयोग कर सकते हैं। यह फ़ाइल-5.32 के साथ मेरे लिए काम करता है। Gentoo पर आपको फ़ाइल पैकेज के लिए अजगर USE- फ़्लैग सक्षम होना चाहिए।
बोदो

36

यह बहुत आसान प्रतीत होता है

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

कृपया पुरानी पोस्ट देखें

अद्यतन - @ टिप्पणी के अनुसार, अजगर 3 में यह अधिक सरल है:

import mimetypes
print(mimetypes.guess_type("sample.html"))

4
मुझे नहीं लगता कि आपके उदाहरण में urllib की आवश्यकता है।
भाईजैक

5
Python 3.X के लिए urlib आयात अनुरोध के साथ आयात urlib को बदलें। और फिर urlib के बजाय "अनुरोध" का उपयोग करें
अर्जुन ठाकुर

1
अजगर 2.7 के लिए भी काम करता है
जय मोदी

@ ओटज़ी समाधान इस मॉड्यूल का उपयोग करता है, लेकिन अधिक सरल है।
गैरेट

11

वहाँ 3 अलग पुस्तकालयों है कि कामेच्छा को लपेटता है।

उनमें से 2 पीपीआई पर उपलब्ध हैं (इसलिए पाइप इंस्टॉल काम करेगा):

  • filemagic
  • अजगर-जादू

और एक और, अजगर-जादू के समान, सीधे लेटेस्ट डिज़ाइन स्रोतों में उपलब्ध है, और यह वह है जो आप शायद अपने लिनक्स वितरण में रखते हैं।

डेबियन में पैकेज पायथन-मैजिक इस बारे में है और इसका उपयोग टोटूओ के रूप में किया जाता है और इसे साइमन ज़िमरमन ने नहीं कहा है।

यह मेरे लिए एक और लगता है (कामेच्छा के मूल लेखक द्वारा)।

बहुत बुरा सीधे पेपी पर उपलब्ध नहीं है।


मैंने सुविधा के लिए रेपो जोड़ा: github.com/mammadori/magic-python जिस तरह से आप कर सकते हैं: pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
मैमडोरी

10

अजगर 2.6 में:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]

6
यह अनावश्यक है, क्योंकि fileकमांड मूल रूप से बस एक आवरण है जिसके चारों ओर कामेच्छा है। आप साइमन के उत्तर में केवल अजगर बंधन (अजगर-जादू) का उपयोग कर सकते हैं।
मेकैनिकल घोंघा

6
यह ऑपरेटिंग सिस्टम पर निर्भर करता है। उदाहरण के लिए, मैक ओएस एक्स पर, आपके पास "फ़ाइल" है, लेकिन सामान्य वातावरण में लिबायनामिक नहीं है।
rptb1

9

2017 अपडेट

गितुब जाने की कोई आवश्यकता नहीं है, यह एक अलग नाम के तहत PyPi पर है:

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

कोड को सरल बनाया जा सकता है:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'

क्या आप js या css फ़ाइल के लिए भी ऐसा कर सकते हैं?
कुंभनवीष

जरूर, क्यों नहीं??
ग्रिंगो सुवे

9

पायथन बाइंडिंग के लिए कामेच्छा

इस विषय पर सभी अलग-अलग उत्तर बहुत ही भ्रमित करने वाले हैं, इसलिए मैं कामेच्छा के विभिन्न बंधनों के इस अवलोकन के साथ थोड़ा और स्पष्टता देने की उम्मीद कर रहा हूं। पहले मम्मादोरी ने छोटा जवाब दिया था उपलब्ध विकल्प को ।

libmagic

फ़ाइलें माइम-प्रकार का निर्धारण करते समय, पसंद का उपकरण बस कहा जाता है fileऔर इसके बैक-एंड कहा जाता है libmagic। ( प्रोजेक्ट होम पेज देखें ।) इस परियोजना को एक निजी cvs-रिपॉजिटरी में विकसित किया गया है, लेकिन गितुब पर केवल पढ़ने के लिए दर्पण है

अब यह उपकरण, जिसकी आपको आवश्यकता होगी यदि आप अजगर के साथ कामेच्छा के किसी भी बंधन का उपयोग करना चाहते हैं, तो पहले से ही अपने स्वयं के अजगर बाइंडिंग के साथ आता है file-magic। उनके लिए बहुत अधिक समर्पित दस्तावेज नहीं है, लेकिन आप हमेशा सी-लाइब्रेरी के मैन पेज पर एक नज़र डाल सकते हैं man libmagic:। मूल उपयोग रीडमी फ़ाइल में वर्णित है :

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)

इसके अलावा, आप उदाहरण फ़ाइल में दिखाए गए अनुसार किसी Magicऑब्जेक्ट का उपयोग करके लाइब्रेरी का उपयोग भी कर सकते हैं ।magic.open(flags)

टूव्यूओ और ईआरआर 2 एसएन दोनों उपकरण file-magicमें शामिल इन बाइंडिंग का उपयोग करते हैं file। वे गलती से मान लेते हैं, वे python-magicपैकेज का उपयोग कर रहे हैं । यह इंगित करता है, कि यदि दोनों fileऔर python-magicस्थापित हैं, तो अजगर मॉड्यूल magicपूर्व को संदर्भित करता है।

अजगर-जादू

यह वह पुस्तकालय है जिसके बारे में साइमन ज़िमरमन अपने उत्तर में बात करते हैं और जिसे क्लाउड कॉउबे के साथ-साथ ग्रिंगो सुवे द्वारा नियोजित भी किया जाता है ।

filemagic

नोट : यह परियोजना आखिरी बार 2013 में अपडेट की गई थी!

एक ही सी-api के आधार पर किया जा रहा के कारण, इस पुस्तकालय के साथ कुछ समानता है file-magicमें शामिल libmagic। यह केवल मम्मादोरी द्वारा उल्लिखित है और कोई अन्य उत्तर इसे नियुक्त नहीं करता है।


7

@toivotuo की विधि ने python3 के तहत मेरे लिए सबसे अच्छा और सबसे मज़बूती से काम किया। मेरा लक्ष्य उन गिज़्ड फ़ाइलों की पहचान करना था जिनके पास विश्वसनीय .gz एक्सटेंशन नहीं है। मैंने पायथन 3-मैजिक स्थापित किया।

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

एक gzipped फ़ाइल के लिए यह रिटर्न: आवेदन / gzip; charset = बाइनरी

अनज़िप्ड txt फ़ाइल (iostat data) के लिए: टेक्स्ट / प्लेन; charset = हमें-ascii

एक टार फ़ाइल के लिए: आवेदन / एक्स-टार; charset = बाइनरी

एक bz2 फ़ाइल के लिए: आवेदन / x-bzip2; charset = बाइनरी

और अंतिम लेकिन मेरे लिए कम से कम एक। ज़िप फ़ाइल: एप्लिकेशन / ज़िप नहीं; charset = बाइनरी


7

पायथन 3 रेफरी: https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type (url, सख्त = सत्य) url द्वारा दिए गए फ़ाइल नाम या URL के आधार पर फ़ाइल के प्रकार का अनुमान लगाएं। वापसी मान एक टपल (प्रकार, एन्कोडिंग) है जहां प्रकार कोई भी नहीं है यदि प्रकार का अनुमान नहीं लगाया जा सकता है (लापता या अज्ञात प्रत्यय) या प्रपत्र 'टाइप / उपप्रकार' की एक स्ट्रिंग, जो MIME सामग्री-प्रकार हेडर के लिए प्रयोग करने योग्य है।

एन्कोडिंग कोई भी एन्कोडिंग या प्रोग्राम के नाम के लिए नहीं है जिसका उपयोग एनकोडिंग के लिए किया जाता है (उदाहरण के लिए सेक या गज़िप)। एन्कोडिंग सामग्री-एन्कोडिंग हेडर के रूप में उपयोग के लिए उपयुक्त है, न कि सामग्री-स्थानांतरण-एन्कोडिंग हेडर के रूप में। मैपिंग टेबल संचालित हैं। एन्कोडिंग प्रत्यय केस संवेदनशील होते हैं; टाइप प्रत्यय को पहले संवेदनशील तरीके से केस करने की कोशिश की जाती है, फिर असंवेदनशील तरीके से केस किया जाता है।

वैकल्पिक सख्त तर्क यह निर्दिष्ट करने वाला एक ध्वज है कि क्या ज्ञात MIME प्रकारों की सूची केवल Iana के साथ पंजीकृत आधिकारिक प्रकारों तक ही सीमित है। जब सख्त सही है (डिफ़ॉल्ट), केवल IANA प्रकार समर्थित हैं; जब सख्त गलत होता है, तो कुछ अतिरिक्त गैर-मानक लेकिन आमतौर पर उपयोग किए जाने वाले MIME प्रकार भी पहचाने जाते हैं।

import mimetypes
print(mimetypes.guess_type("sample.html"))

6

आपने यह नहीं बताया कि आप किस वेब सर्वर का उपयोग कर रहे हैं, लेकिन अपाचे में माइम मैजिक नामक एक छोटा सा मॉड्यूल है, जो ऐसा करने के लिए कहा जाने पर एक फ़ाइल के प्रकार को निर्धारित करने के लिए उपयोग करता है। यह फ़ाइल की कुछ सामग्री को पढ़ता है और यह पता लगाने की कोशिश करता है कि यह किस प्रकार के वर्णों पर आधारित है। और डेव वेब के रूप में उल्लेख किया माइमटेप्स मॉड्यूल को अजगर के तहत , काम करेगा, बशर्ते कि एक विस्तार आसान हो।

वैकल्पिक रूप से, यदि आप UNIX बॉक्स पर बैठे हैं, तो आप sys.popen('file -i ' + fileName, mode='r')MIME प्रकार को हथियाने के लिए उपयोग कर सकते हैं । विंडोज में एक समतुल्य कमांड होनी चाहिए, लेकिन मैं अनिश्चित हूं कि यह क्या है।


7
अब आप बस सबप्रोसेस कर सकते हैं। चेक_आउट (['फ़ाइल', '-बी', '- माइम', फ़ाइल नाम])
नाथन

जब कोई भी बाहरी उपकरण का उपयोग करने का सहारा लेने का वास्तव में कोई कारण नहीं है, तो अजगर-जादू, सभी लिपटे और आरामदायक समान काम करता है।
बजे डैम

4

Python 3.x और webapp में url के साथ फाइल में जो एक्सटेंशन या नकली एक्सटेंशन नहीं हो सकता है। आपको उपयोग करके अजगर-जादू स्थापित करना चाहिए

pip3 install python-magic

Mac OS X के लिए, आपको उपयोग करते हुए libmagic भी स्थापित करना चाहिए

brew install libmagic

सांकेतिक टुकड़ा

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)

वैकल्पिक रूप से आप रीड में एक आकार डाल सकते हैं

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)

क्या यह पूरी फाइल लोड होगी?
吴毅 吴毅

नहीं, यह एक धारा है, इसलिए आम तौर पर सिर्फ कुछ बाइट्स।
क्लॉड क्युम्बे

मैंने response.readline () या response.read (128) द्वारा संपादित किया है धन्यवाद!
क्लॉड क्युम्बे

3

मैं पहले mimetypes लाइब्रेरी की कोशिश करता हूं। यदि यह काम नहीं कर रहा है, तो मैं इसके बजाय अजगर-जादू का उपयोग करता हूं।

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

1

Mimetypes मॉड्यूल बस फ़ाइल एक्सटेंशन के आधार पर एक फ़ाइल प्रकार को पहचानता है। यदि आप एक्सटेंशन के बिना किसी फ़ाइल प्रकार की फ़ाइल पुनर्प्राप्त करने का प्रयास करेंगे, तो mimetypes काम नहीं करेगा।


3
मुझे नहीं लगता कि यह सच है। MIME प्रकार डेटा प्रारूप के बारे में दूसरों को बताने के तरीके के बारे में है, न कि स्वयं डेटा प्रारूप का पता लगाने के तरीके के बारे में। यदि आप एक टूल का उपयोग करते हैं जो केवल एक्सटेंशन के आधार पर प्रारूप का अनुमान लगाता है और MIME प्रकारों को प्रिंट करता है तो आप उस टूल का उपयोग नहीं कर सकते हैं यदि कोई फ़ाइल एक्सटेंशन नहीं हैं। लेकिन प्रारूप का अनुमान लगाने के अन्य तरीके भी संभव हैं, उदाहरण के लिए, एक पार्सर के साथ जाँच करके।
erikbwork

1

मुझे आश्चर्य है कि किसी ने भी इसका उल्लेख नहीं किया है पाइमेन्स , विशेष रूप से, पाठ दस्तावेजों के माइम-प्रकार के बारे में एक शिक्षित अनुमान लगाने में सक्षम है।

Py Py वास्तव में Python सिंटैक्स हाइलाइटिंग लाइब्रेरी है, लेकिन एक विधि है जो एक शिक्षित अनुमान लगाती है कि आपके दस्तावेज़ में 500 समर्थित दस्तावेज़ों में से कौन सा प्रकार है। यानी सी ++ बनाम सी # बनाम पायथन बनाम आदि

import inspect

def _test(text: str):
    from pygments.lexers import guess_lexer
    lexer = guess_lexer(text)
    mimetype = lexer.mimetypes[0] if lexer.mimetypes else None
    print(mimetype)

if __name__ == "__main__":
    # Set the text to the actual defintion of _test(...) above
    text = inspect.getsource(_test)
    print('Text:')
    print(text)
    print()
    print('Result:')
    _test(text)

आउटपुट:

Text:
def _test(text: str):
    from pygments.lexers import guess_lexer
    lexer = guess_lexer(text)
    mimetype = lexer.mimetypes[0] if lexer.mimetypes else None
    print(mimetype)


Result:
text/x-python

अब, यह सही नहीं है, लेकिन अगर आपको यह बताने में सक्षम होने की आवश्यकता है कि 500 ​​दस्तावेज़ों में से कौन सा प्रारूप उपयोग किया जा रहा है, तो यह बहुत उपयोगी है।


0

मैंने बहुत सारे उदाहरणों की कोशिश की है लेकिन Django म्यूटाजेन के साथ अच्छी तरह से खेलता है।

उदाहरण जाँच है कि क्या फ़ाइल है mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

नकारात्मक पक्ष यह है कि फ़ाइल प्रकारों की जांच करने की आपकी क्षमता सीमित है, लेकिन यह एक शानदार तरीका है यदि आप न केवल फ़ाइल प्रकार की जांच करना चाहते हैं, बल्कि अतिरिक्त जानकारी भी प्राप्त कर सकते हैं।


मुझे सुरक्षा की भी जाँच करने की आवश्यकता है
आर्टेम बर्नत्स्की


0

बाइट ऐरे प्रकार के डेटा के लिए आप मैजिक का उपयोग कर सकते हैं। From_buffer (_byte_array, mime = True)


-1

आप imghdr पायथन मॉड्यूल का उपयोग कर सकते हैं ।


1
यह एक उपयोगी टिप्पणी नहीं है, क्योंकि यह उदाहरण नहीं देता है और न ही यह वास्तव में कहता है कि कैसे या क्यों imghdr यहाँ मदद करेगा।
erikbwork

2
हां मैं समझता हूं। यह एक साल पहले खत्म हो गया है, लेकिन हो सकता है कि आप अभी भी इसे अपडेट कर सकते हैं क्योंकि अभी भी मेरे जैसे लोग इस सवाल को खोज रहे हैं। अगर आपको मदद चाहिए, तो आप मुझे बता सकते हैं।
एरिक्बवर्क

1
यह केवल छवि प्रकारों की बहुत सीमित सूची के लिए काम करता है। इसका टेक्स्ट फ़ाइलों, संपीड़ित अभिलेखागार, दस्तावेज़ स्वरूपों आदि के बारे में कोई पता नहीं है
ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.