अजगर में एक्सटेंशन के बिना फ़ाइलों के प्रकार की जांच कैसे करें?


87

मेरे पास फ़ाइलों से भरा एक फ़ोल्डर है और उनके पास एक्सटेंशन नहीं है। मैं फ़ाइल प्रकारों की जांच कैसे कर सकता हूं? मैं फ़ाइल प्रकार की जांच करना चाहता हूं और तदनुसार फ़ाइल नाम बदलना चाहता हूं। मान लेते हैं कि फंक्शन filetype(x)एक फाइल टाइप देता है जैसे png। मैं यह करना चाहता हूँ:

files = os.listdir(".")
for f in files:
    os.rename(f, f+filetype(f))

मैं यह कैसे करु?



के संबंध में आपको अधिक विशिष्ट होना पड़ेगा file types। क्या इसका मतलब यह है कि यह gif, png, bmp या jpg है? क्या आप जानना चाहते हैं कि क्या यह टेक्स्ट / बाइनरी है? निष्पादन?
जोफिश

@ thg435, एक बार जब आपके पास MIME प्रकार होता है, तो क्या यह एक उपयुक्त फ़ाइल नाम एक्सटेंशन में बदलने का एक तरीका है?
मार्क रैनसम

@ मार्क: हाँ, अनुमान_का उपयोग करें , लेकिन वास्तव में, mimetypes यहाँ काम नहीं करेगा, क्योंकि यह फ़ाइल एक्सटेंशन पर आधारित है। उन्हें क्या जरूरत है कामेच्छा (लिंक पर दूसरा जवाब देखें)।
जॉर्ज

जवाबों:


92

पायथन लाइब्रेरी हैं जो अपनी सामग्री (आमतौर पर हेडर / मैजिक नंबर) के आधार पर फाइलों को पहचान सकती हैं और जो फ़ाइल नाम या एक्सटेंशन पर निर्भर नहीं होती हैं।

यदि आप कई अलग-अलग फ़ाइल प्रकारों को संबोधित कर रहे हैं, तो आप उपयोग कर सकते हैं python-magic। यह अच्छी तरह से स्थापित magicपुस्तकालय के लिए सिर्फ एक पायथन बंधन है । इसकी एक अच्छी प्रतिष्ठा और (छोटा समर्थन) है जो मैंने इसके उपयोग से सीमित किया है, यह ठोस रहा है।

अधिक विशिष्ट फ़ाइल प्रकारों के लिए पुस्तकालय भी हैं। उदाहरण के लिए, पायथन मानक पुस्तकालय में imghdrमॉड्यूल है जो छवि फ़ाइल प्रकारों के लिए एक ही काम करता है।

यदि आपको निर्भरता-मुक्त (शुद्ध पायथन) फ़ाइल प्रकार जाँच की आवश्यकता है, तो देखें filetype


2
पैकेज python-magic-win64ने विंडोज में मेरे लिए काम किया
चेसुआरआर

2
imgdr के संयोजन के साथ filetype मेरे लिए खिड़कियों में काम किया
हृषीकेश धूमल

62

अजगर जादू पुस्तकालय कार्यक्षमता की जरूरत है प्रदान करता है।

आप पुस्तकालय को इसके साथ स्थापित कर सकते हैं pip install python-magicऔर निम्नानुसार उपयोग कर सकते हैं:

>>> import magic

>>> magic.from_file('iceland.jpg')
'JPEG image data, JFIF standard 1.01'

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

>>> magic.from_file('greenland.png')
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'

>>> magic.from_file('greenland.png', mime=True)
'image/png'

इस मामले में अजगर कोड के लिए बुला रहा है libmagic हुड, जो * NIX द्वारा इस्तेमाल किया ही पुस्तकालय है नीचे fileआदेश। इस प्रकार, यह सबप्रोसेस / शेल-आधारित उत्तरों के समान है, लेकिन उस ओवरहेड के बिना।


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

1
@ रिचर्ड क्या आपको ओवरहेड पहलू पर विस्तार से ध्यान देना चाहिए? python-magicफिर उपप्रोसेस दृष्टिकोण का उपयोग करके पुस्तकालय को और अधिक कुशल क्या बनाता है ?
ग्रेग

9

यूनिक्स और लाइनक्स पर fileफ़ाइल प्रकारों का अनुमान लगाने की कमान है। यहां तक ​​कि एक विंडोज़ पोर्ट भी है ।

से आदमी पेज :

फ़ाइल इसे वर्गीकृत करने के प्रयास में प्रत्येक तर्क का परीक्षण करती है। इस क्रम में किए गए परीक्षणों के तीन सेट हैं: फाइलसिस्टम परीक्षण, मैजिक नंबर परीक्षण और भाषा परीक्षण। पहला परीक्षण जो सफल होता है, वह फ़ाइल प्रकार को प्रिंट करने का कारण बनता है।

आपको मॉड्यूल के fileसाथ कमांड को चलाने की आवश्यकता होगी subprocessऔर फिर एक्सटेंशन का पता लगाने के लिए परिणामों को पार्स करना होगा।

संपादित करें: मेरे उत्तर को अनदेखा करें । इसके बजाय क्रिस जॉनसन के जवाब का उपयोग करें ।


+1 मुझे यह महसूस नहीं fileहुआ कि इतना किया। # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
जोफिश

खैर, मैं उम्मीद कर रहा था कि किसी के पास बेहतर जवाब होगा। ओपी के लिए अभी भी बहुत काम है, यह एक साधारण फ़ंक्शन कॉल नहीं है।
स्टीवन रूम्बल्स्की

2
+1 fileकमांड का उपयोग करने के साथ एक लाभ यह है कि यह (अधिकांश?) लिनक्स वितरण पर देशी है जबकि python-magicइसका उपयोग करने से पहले इसे डाउनलोड और इंस्टॉल नहीं किया जाना है। यह कुछ समस्या है अगर मॉड्यूल का उपयोग करने वाली स्क्रिप्ट को पोर्टेबल माना जाता है।
हैलोगूडीबाई


6

आप fileपायथन के लिए आधिकारिक बंधन भी स्थापित कर सकते हैं , एक पुस्तकालय जिसे file-magicयह कहा जाता है (यह ctypes का उपयोग नहीं करता है, जैसे python-magic)।

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


6
import subprocess
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)

जैसा कि स्टीवन ने बताया, subprocessतरीका है। आप ऊपर दिए गए तरीके से कमांड आउटपुट प्राप्त कर सकते हैं जैसा कि इस पोस्ट ने कहा है


और आप आउटपुट कैसे कैप्चर करते हैं?
मार्क रैनसम

@MarkRansom खेद है कि एक अच्छा तरीका नहीं था, कृपया मेरे अपडेट ऊपर देखें
xvatar

यदि आपको पायथन लाइब्रेरी का उपयोग करने के बजाय अपने सिस्टम के साथ बातचीत करने की आवश्यकता है, तो समाधान को अधिकतर समय अपनाया जाता है, क्योंकि यह एक अलग एपीआई के साथ अन्य ऑपरेटिंग सिस्टम में उपयोगी नहीं है।
erikbwork

4

नए उप-पुस्तकालय के साथ, आप अब निम्नलिखित कोड (* केवल समाधान nix) का उपयोग कर सकते हैं:

import subprocess
import shlex

filename = 'your_file'
cmd = shlex.split('file --mime-type {0}'.format(filename))
result = subprocess.check_output(cmd)
mime_type = result.split()[-1]
print mime_type

जवाब के लिए धन्यवाद। BTW, आपको एक cmd लाइन पर str.split () का उपयोग नहीं करना चाहिए। shlex.split (cmd) का उपयोग करें।
एमनूर

उपयोग करने के बजाय shlex.split, बस क्यों नहीं subprocess.check_output(['file', '--mime-type', filename])?
7

1

भी आप इस कोड का उपयोग कर सकते हैं (हेडर फ़ाइल के 3 बाइट द्वारा शुद्ध अजगर):

full_path = os.path.join(MEDIA_ROOT, pathfile)

try:
    image_data = open(full_path, "rb").read()
except IOError:
    return "Incorrect Request :( !!!"

header_byte = image_data[0:3].encode("hex").lower()

if header_byte == '474946':
    return "image/gif"
elif header_byte == '89504e':
    return "image/png"
elif header_byte == 'ffd8ff':
    return "image/jpeg"
else:
    return "binary file"

बिना किसी पैकेज के [और अद्यतन संस्करण] स्थापित करें


मैं xlsx की जांच कैसे कर सकता हूं?
हर्षा बियानी

आप 4 या 8 बाइट्स द्वारा उपयोग कर सकते हैं। XLSX (MS Office Open XML प्रारूप दस्तावेज़) => 50 4B 03 04 (4 बाइट्स) => ASCII (PK ••) या XLSX (MS Office 2007 दस्तावेज़) => 50 4B 03 04 14 00 06 00 (8 बाइट्स) = > ASCII (पीके ••••••)
सदाबहार

0

केवल लिनक्स के लिए काम करता है, लेकिन "श" अजगर मॉड्यूल का उपयोग करके आप किसी भी शेल कमांड को कॉल कर सकते हैं

https://pypi.org/project/sh/

पाइप स्थापित श

आयात श

sh.file ( "/ जड़ / फ़ाइल")

आउटपुट: / रूट / फ़ाइल: ASCII पाठ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.