2012-04-14 9 views
5

क्या यह पहचानने का कोई तरीका है कि पाठ फ़ाइल यूटीएफ -8 पायथन में है या नहीं?यूटीएफ -8 का उपयोग करके फ़ाइल को एन्कोड किए जाने पर मुझे कैसे पता चलेगा?

मैं वास्तव में यह जानना चाहूंगा कि फ़ाइल यूटीएफ -8 है या नहीं। मुझे अन्य एन्कोडिंग का पता लगाने की आवश्यकता नहीं है।

+1

डुप्लिकेट? http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file और http://stackoverflow.com/questions/2144815/how- एन्कोडिंग-ऑफ-ए-फाइल-इन-पायथन – CppLearner

+0

मैं यूटीएफ -8 (सत्य/झूठा) का पता लगाने के लिए कह रहा था, हर एन्कोडिंग नहीं। – Riki137

+0

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

उत्तर

16

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

यदि आप जानते हैं कि यह यूटीएफ -8 या सिंगल बाइट एन्कोडिंग latin-1 है, तो इसे पहले यूटीएफ -8 में खोलें और फिर अन्य एन्कोडिंग में देखें। अगर फ़ाइल में केवल ASCII वर्ण हैं, तो यह यूटीएफ -8 में खोला जाएगा, भले ही इसे अन्य एन्कोडिंग के रूप में बनाया गया हो। यदि इसमें कोई गैर-ASCII वर्ण शामिल हैं, तो यह लगभग हमेशा सही ढंग से दोनों के बीच सही वर्ण सेट का पता लगाएगा। 1.0.1

यूनिवर्सल एन्कोडिंग डिटेक्टर

का पता लगाता है

chardet:

try: 
    # or codecs.open on Python 2 
    filedata = open(filename, encoding='UTF-8').read() 
except: 
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

आपका सबसे अच्छा शर्त, chardet package from PyPI उपयोग करने के लिए है या तो सीधे या BeautifulSoup से UnicodeDamnit के माध्यम से

  • ASCII, UTF-8, UTF-16 (2 वेरिएंट), UTF-32 (4 वेरिएंट)
  • बिग 5, GB2312, ईयूसी-TW, हर्ट्ज-जीबी 2312, आईएसओ-2022-सीएन (पारंपरिक और सरलीकृत चीनी)
  • ईयूसी-जेपी, SHIFT_JIS, आईएसओ-2022-जेपी (जापानी)
  • ईयूसी-के.आर., आईएसओ-2022-के.आर. (कोरियाई)
  • केओआई8-आर, MacCyrillic, IBM855, IBM866, आईएसओ 8859 -5, विंडोज़ -1251 (सिरिलिक)
  • ISO-8859-2, विंडोज़ -1250 (हंगरी)
  • आईएसओ-8859-5, विंडोज़ -1251 (बल्गेरियाई)
  • windows-1252 (English)
  • आईएसओ-8859-7, विंडोज़ -1253 (ग्रीक)
  • आईएसओ-8859-8, विंडोज़ -1255 (दृश्य और तार्किक हिब्रू)
  • TIS-620 (थाई)

अजगर 2.1 या बाद

आवश्यक है हालांकि, कुछ फाइलों से अधिक एन्कोडिंग में मान्य होगा, इसलिए chardet रामबाण नहीं है।

+0

'chardet' इतना धीमा है! – simon

+4

@ सिमॉन: यही कारण है कि ['cchardet'] (https://github.com/PyYoshi/cChardet) (नोट: दो' सी') – jfs

2

विश्वसनीय रूप से? सं

सामान्य तौर पर, एक बाइट क्रम जब तक आप जानते हैं कि यह कैसे व्याख्या करने के लिए कोई मतलब नहीं है - यह पाठ फ़ाइलों के लिए चला जाता है, लेकिन यह भी पूर्णांकों, चल बिन्दु नंबर, आदि

के तरीके

लेकिन, देखते हैं बाइट ऑर्डर मार्क (यदि कोई है तो) और फ़ाइल का पहला हिस्सा देखकर फ़ाइल के एन्कोडिंग का आकलन करना (यह देखने के लिए कि कौन सी एन्कोडिंग सबसे समझदार पात्र उत्पन्न करती है)। chardet लाइब्रेरी इस पर बहुत अच्छी है, लेकिन जागरूक रहें, यह केवल एक ह्युरिस्टिक है, यद्यपि एक शक्तिशाली व्यक्ति है।

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