2013-09-02 9 views
5

मैं पाइथन या टेक्स्ट एन्कोडिंग की तुलना में साइकिल की मरम्मत, चेनसॉ उपयोग और खाई सुरक्षा के बारे में और अधिक जानता हूं; इस बात को ध्यान में ... साथपायथन के साथ टेक्स्ट फ़ाइल एन्कोडिंग का पता लगाने के लिए मेरे कोड में समस्याएं?

अजगर पाठ एन्कोडिंग एक बारहमासी मुद्दा (मेरे अपने प्रश्न हो रहा है: Searching text files' contents with various encodings with Python?, और दूसरों को मैं पढ़ा है: 1, 2 अनुमान लगाना कुछ कोड लिखने पर मैं एक दरार लिया है। नीचे एन्कोडिंग।

सीमित परीक्षण में इस कोड को मुझे पाठ एन्कोडिंग के पहले तीन बाइट्स और स्थितियों में, जहां उन डेटा जानकारीपूर्ण नहीं कर रहे हैं के बारे में एक अतिरिक्त पता करने के लिए बिना मेरी प्रयोजनों * के लिए काम करने लगता है।

* मेरे उद्देश्य हैं:

  1. एक निर्भरता मुक्त स्निपेट है जिसका उपयोग मैं मध्यम स्तर की सफलता के साथ कर सकता हूं,
  2. किसी भी एन्कोडिंग की टेक्स्ट आधारित लॉग फ़ाइलों के लिए स्थानीय वर्कस्टेशन स्कैन करें और उन्हें अपनी सामग्री के आधार पर रुचि रखने वाली फ़ाइल के रूप में पहचानें (जिसके लिए फ़ाइल को उचित एन्कोडिंग के साथ खोला जाना आवश्यक है)
  3. इसे काम करने की चुनौती के लिए।

प्रश्न: मैं क्या मान लें कि एक तुलना और पात्रों की गिनती की तरह मैं नीचे कर के एक klutzy विधि के लिए उपयोग करने के साथ नुकसान क्या हैं? किसी इनपुट की काफी सराहना की जाती है।

def guess_encoding_debug(file_path): 
    """ 
    DEBUG - returns many 2 value tuples 
    Will return list of all possible text encodings with a count of the number of chars 
    read that are common characters, which might be a symptom of success. 
    SEE warnings in sister function 
    """ 

    import codecs 
    import string 
    from operator import itemgetter 

    READ_LEN = 1000 
    ENCODINGS = ['ascii','cp1252','mac_roman','utf_8','utf_16','utf_16_le',\ 
       'utf_16_be','utf_32','utf_32_le','utf_32_be'] 

    #chars in the regular ascii printable set are BY FAR the most common 
    #in most files written in English, so their presence suggests the file 
    #was decoded correctly. 
    nonsuspect_chars = string.printable 

    #to be a list of 2 value tuples 
    results = [] 

    for e in ENCODINGS: 
     #some encodings will cause an exception with an incompatible file, 
     #they are invalid encoding, so use try to exclude them from results[] 
     try: 
      with codecs.open(file_path, 'r', e) as f: 

       #sample from the beginning of the file 
       data = f.read(READ_LEN) 

       nonsuspect_sum = 0 

       #count the number of printable ascii chars in the 
       #READ_LEN sized sample of the file 
       for n in nonsuspect_chars: 
        nonsuspect_sum += data.count(n) 

       #if there are more chars than READ_LEN 
       #the encoding is wrong and bloating the data 
       if nonsuspect_sum <= READ_LEN: 
        results.append([e, nonsuspect_sum]) 
     except: 
      pass 

    #sort results descending based on nonsuspect_sum portion of 
    #tuple (itemgetter index 1). 
    results = sorted(results, key=itemgetter(1), reverse=True) 

    return results 


def guess_encoding(file_path): 
    """ 
    Stupid, simple, slow, brute and yet slightly accurate text file encoding guessing. 
    Will return one likely text encoding, though there may be others just as likely. 
    WARNING: DO NOT use if your file uses any significant number of characters 
      outside the standard ASCII printable characters! 
    WARNING: DO NOT use for critical applications, this code will fail you. 
    """ 

    results = guess_encoding_debug(file_path) 

    #return the encoding string (second 0 index) from the first 
    #result in descending list of encodings (first 0 index) 
    return results[0][0] 

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

बाहरी पुस्तकालयों भविष्य में एक विकल्प हो सकता है, लेकिन अब के लिए मैं उन्हें से बचने के लिए, क्योंकि:

  1. यह स्क्रिप्ट पर और अजगर के विभिन्न संस्करणों के साथ नेटवर्क बंद कई कंपनी के कंप्यूटर पर चलाया जाएगा, तो कम जटिलताओं बेहतर है। जब मैं कहता हूं 'कंपनी' मेरा मतलब है सामाजिक वैज्ञानिकों के छोटे लाभ।
  2. मैं जीपीएस डेटा प्रोसेसिंग से लॉग एकत्र करने का प्रभारी हूं, लेकिन मैं सिस्टम प्रशासक नहीं हूं - वह एक अजगर प्रोग्रामर नहीं है और जितना कम समय मैं उसे बेहतर लेता हूं।
  3. पाइथन की स्थापना जो आमतौर पर मेरी कंपनी में उपलब्ध है, एक जीआईएस सॉफ्टवेयर पैकेज के साथ स्थापित है, और आमतौर पर अकेले छोड़ने पर बेहतर होता है।
  4. मेरी आवश्यकताएं बहुत सख्त नहीं हैं, मैं बस उन फ़ाइलों की पहचान करना चाहता हूं जिनमें मुझे रूचि है और उन्हें संग्रह में कॉपी करने के लिए अन्य विधियों का उपयोग करना है। मैं सामग्रियों में हेरफेर करने, जोड़ने या फिर से लिखने के लिए स्मृति में पूर्ण सामग्री नहीं पढ़ रहा हूं।
  5. ऐसा लगता है कि एक उच्च स्तरीय प्रोग्रामिंग भाषा के पास इसे स्वयं पूरा करने का कोई तरीका होना चाहिए। जबकि "ऐसा लगता है" किसी भी प्रयास के लिए एक अशांत नींव है, मैं कोशिश करना चाहता था और देखना चाहता था कि मैं इसे काम पर ला सकता हूं या नहीं।
+0

+1 एक अच्छी तरह से लिखित प्रश्न के लिए +1! अच्छी तरह से शोध, अच्छी तरह से लिखित उदाहरण भी। –

+1

मौजूदा पुस्तकालय की कोशिश नहीं करने का कोई कारण? चार्डेट या चेयर की तरह (https://code.google.com/p/chared/)? – amit

+0

जो मैं समझता हूं उससे कुछ बहुत अच्छी पुस्तकालय इस तरह के लिए उपलब्ध हैं, जैसे कि आपने उल्लेख किया है। मुझे उम्मीद है कि उनका उपयोग कैसे करें, यह जानने के लिए समय है क्योंकि मुझे यकीन है कि वे अधिक शक्तिशाली हैं कि मैं किसके साथ आ सकता हूं। हालांकि, बाहरी पुस्तकालय से बचने के कई कारण हैं। मैंने अपने पदों को बेहतर तरीके से मेरे कारणों में संपादित किया है। –

उत्तर

0

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

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