2009-09-18 12 views
13

मैं पहचान जो फ़ाइलद्विआधारी है और जो एक पाठ एक निर्देशिका में है की जरूरत है।पायथन का उपयोग कर बाइनरी और टेक्स्ट फ़ाइलों की पहचान कैसे करें?

मैं उपयोग Mimetypes की कोशिश की लेकिन यह मेरे मामले में एक अच्छा विचार नहीं है नहीं कर सकते, क्योंकि यह सभी फाइलों mimes की पहचान, और मैं अजनबियों लोगों यहाँ है ... मैं तो बस, पता की जरूरत है द्विआधारी या पाठ। सरल ? लेकिन मैं एक समाधान खोजने के couldn't ...

धन्यवाद

+2

आपके लिए एक टेक्स्ट फ़ाइल क्या है? क्या यूटीएफ -16-बीई ने यूनिकोड गिनती को एन्कोड किया है, उदाहरण के लिए? –

+3

आपको किसी भी व्यक्ति की मदद करने से पहले 'बाइनरी' और 'टेक्स्ट' द्वारा सटीक रूप से परिभाषित करने की आवश्यकता है। –

+0

टेक्स्ट फ़ाइल ऐसी कोई भी फ़ाइल है जो मनुष्यों द्वारा पठनीय है। कहें, कोई भी फ़ाइल जिसे आप "बिल्ली" (लिनक्स) या "टाइप" (विंडोज़) कमांड द्वारा पढ़ सकते हैं। – Thomas

उत्तर

9

सभी को धन्यवाद, मुझे एक समाधान मिला जो मेरी समस्या के अनुरूप है। मुझे यह कोड http://code.activestate.com/recipes/173220/ पर मिला और मैंने मुझे सूट करने के लिए बस थोड़ा सा टुकड़ा बदल दिया।

यह ठीक काम करता है।

from __future__ import division 
import string 

def istext(filename): 
    s=open(filename).read(512) 
    text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b")) 
    _null_trans = string.maketrans("", "") 
    if not s: 
     # Empty files are considered text 
     return True 
    if "\0" in s: 
     # Files with null bytes are likely binary 
     return False 
    # Get the non-text characters (maps a character to itself then 
    # use the 'remove' option to get rid of the text characters.) 
    t = s.translate(_null_trans, text_characters) 
    # If more than 30% non-text characters, then 
    # this is considered a binary file 
    if float(len(t))/float(len(s)) > 0.30: 
     return False 
    return True 
+7

आपके कोड के लिए थोड़ा सुधार: 'अगर फ्लोट (लेन (टी))/फ्लोट (लेन)) 0.30: वापसी 0' अन्यथा, पायथन पूर्णांक विभाजन का उपयोग करेगा, और तुलना केवल सत्य होगी जब लेन (टी) == लेन (0) –

+1

थॉमस, कृपया जवाब में "फ्लोट" सुधार लागू करें! सक्रिय करने के लिए भी अपने नुस्खा को ठीक करना चाहिए! ;) लेकिन मुझे टिप्पणियों को टक्कर देने के लिए साइन अप करने पर परेशान नहीं किया जा सकता है। –

+0

भी पिछली पंक्ति पर एक पिछला * है, –

4

अपनी स्क्रिप्ट * nix पर चल रहा है, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं:

import subprocess 
import re 

def is_text(fn): 
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0] 
    return re.search('text', msg) != None 
+0

बस सबस्ट्रिंग ढूंढने पर 'पुनः' की आवश्यकता नहीं है। –

+0

काम नहीं करता है अगर 'टेक्स्ट' बाइनरी फ़ाइल फ़ाइलपैथ का हिस्सा है। – Paddre

+1

मैं सुझाव देता हूं कि पॉपन (["फाइल", "- माइम", एफएन] ...)। अन्यथा "टेक्स्ट" शब्द प्रकट नहीं हो सकता है। मेरे लिनक्स पर, फ़ोरट्रान प्रोग्राम की तरह दिखने वाले किसी चीज़ का उत्तर "फोर्टन प्रोग्राम" है। यदि आप माइम स्विच जोड़ते हैं तो आपको "टेक्स्ट/एक्स-फोर्ट्रान; charset = us-ascii" मिलता है। – Tsf

7

यह स्वाभाविक नहीं आसान है। निश्चित रूप से जानने का कोई तरीका नहीं है, हालांकि आप ज्यादातर मामलों में उचित अनुमान लगा सकते हैं।

चीजें आपको पसंद आ सकते करने के लिए:

  • द्विआधारी हस्ताक्षर में ज्ञात जादू संख्या के लिए देखो फ़ाइल
  • के शुरू में यूनिकोड बाइट-आदेश-चिह्न के लिए
  • देखो तो फ़ाइल है नियमित रूप से 00 xx 00 xx 00 xx (मनमानी xx के लिए) या इसके विपरीत, यह संभवतः यूटीएफ -16
  • अन्यथा, फ़ाइल में 0s देखें; एक 0 -38 के साथ एक फ़ाइल एक एकल-बाइट-एन्कोडिंग टेक्स्ट फ़ाइल होने के लिए की संभावना नहीं है।

लेकिन यह सब अनुमानी है - यह एक फ़ाइल जो एक वैध पाठ फ़ाइल और मान्य छवि फ़ाइल, उदाहरण के लिए है करने के लिए संभव है। यह शायद एक पाठ फ़ाइल के रूप में बकवास होगा, लेकिन कुछ एन्कोडिंग या अन्य में वैध ...

4

यह libmagic उपयोग करने के लिए python-magic का उपयोग कर फ़ाइल के MIME प्रकार का अनुमान लगाना संभव हो सकता है। यदि आप "text/*" नेमस्पेस में कुछ वापस प्राप्त करते हैं, तो संभवतः एक टेक्स्ट फ़ाइल हो सकती है, जबकि अन्य किसी भी binary file की संभावना है।

संबंधित मुद्दे

 संबंधित मुद्दे