2013-11-04 9 views
7

में यूनिडोड का उपयोग कैसे करें मैं टेक्स्ट दस्तावेज़ से सभी गैर-असीसी वर्णों को हटाने का प्रयास कर रहा हूं। मुझे एक पैकेज मिला जो कि ऐसा करना चाहिए, https://pypi.python.org/pypi/Unidecodeपाइथन (3.3)

इसे एक स्ट्रिंग स्वीकार करनी चाहिए और सभी गैर-एसीआई अक्षरों को निकटतम एसीसी चरित्र में परिवर्तित करना चाहिए। मैंने इस मॉड्यूल को आसानी से while (<input>) { $_ = unidecode($_); } पर कॉल करके आसानी से उपयोग किया था और यह एक पेर्ल मॉड्यूल का सीधा बंदरगाह है, दस्तावेज इंगित करता है कि इसे वही काम करना चाहिए।

मुझे यकीन है कि यह कुछ आसान है, मैं सिर्फ यह जानने के लिए चरित्र और फ़ाइल एन्कोडिंग के बारे में पर्याप्त समझ में नहीं आता हूं। मेरा मूलभूत यूटीएफ -8 में एन्कोड किया गया है (यूसीएस-2LE से परिवर्तित)। समस्या को एन्कोडिंग ज्ञान की कमी और मॉड्यूल की तुलना में गलत तारों को संभालने के साथ और अधिक करना पड़ सकता है, उम्मीद है कि कोई भी क्यों समझा सकता है। मैंने यादृच्छिक रूप से कोड डालने के बिना जो कुछ भी मुझे पता है, मैंने कोशिश की है और अब तक कोई भाग्य नहीं होने वाली त्रुटियों की खोज की है।

यहाँ मेरी अजगर

from unidecode import unidecode 

def toascii(): 
    origfile = open(r'C:\log.convert', 'rb') 
    convertfile = open(r'C:\log.toascii', 'wb') 

    for line in origfile: 
     line = unidecode(line) 
     convertfile.write(line) 

    origfile.close() 
    convertfile.close() 

toascii(); 

तो मैं for line in origfile: लाइन से एक त्रुटि UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 1563: character maps to <undefined> मिलता है अगर मैं बाइट मोड (origfile = open('file.txt','r') में मूल फ़ाइल को खोलने नहीं है।

यदि मैं इसे बाइट मोड 'rb' में खोलता हूं तो मुझे line = unidecode(line) लाइन से TypeError: ord() expected string length 1, but int found मिलता है।

यदि मैं स्ट्रिंग line = unidecode(str(line)) के रूप में लाइन घोषित करता हूं तो यह फ़ाइल को लिख देगा, लेकिन ... सही नहीं है। \r\n'b'\xef\xbb\xbf[ 2013.10.05 16:18:01 ] User_Name > .\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\ यह \ n, \ r, आदि और यूनिकोड वर्णों को उन्हें किसी भी रूप में परिवर्तित करने के बजाय लिख रहा है।

अगर मैं स्ट्रिंग के लिए लाइन में परिवर्तित रूप में ऊपर, और बाइट मोड में convertfile खोलने 'wb' यह यह एक स्ट्रिंग 'wb' और unidecode(line) तो मैं प्राप्त की घोषणा के बिना त्रुटि TypeError: 'str' does not support the buffer interface

अगर मैं बाइट मोड में खोलने देता है TypeError: ord() expected string length 1, but int found फिर से त्रुटि।

उत्तर

8

unidecode मॉड्यूल यूनिकोड स्ट्रिंग मूल्यों और रिटर्न एक यूनिकोड स्ट्रिंग पायथन 3. में आप के बजाय यह बाइनरी डेटा दे रहे हैं स्वीकार करता है। यूनिकोड को डीकोड करें या टेक्स्टमोड में इनपुट टेक्स्ट फ़ाइल खोलें, और परिणाम को फ़ाइल में लिखने से पहले ASCII को एन्कोड करें, या टेक्स्ट मोड में आउटपुट टेक्स्ट फ़ाइल खोलें। मॉड्यूल प्रलेखन से

का हवाला देते हुए:

The module exports a single function that takes an Unicode object (Python 2.x) or string (Python 3.x) and returns a string (that can be encoded to ASCII bytes in Python 3.x)

जोर मेरा।

यह काम करना चाहिए:

def toascii(): 
    with open(r'C:\log.convert', 'r', encoding='utf8') as origfile, open(r'C:\log.toascii', 'w', encoding='ascii') as convertfile: 
     for line in origfile: 
      line = unidecode(line) 
      convertfile.write(line) 

यह पाठ काम करने में inputfile खोलता है (UTF8 एन्कोडिंग का उपयोग कर, जो अपने नमूना लाइन द्वारा पहचानने सही है) और पाठ काम (ASCII करने के लिए एन्कोडिंग) में लिखते हैं।

आपको उस फ़ाइल के एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है जिसे आप खोल रहे हैं; यदि आप एन्कोडिंग को छोड़ देते हैं तो वर्तमान सिस्टम लोकेल का उपयोग किया जाता है (locale.getpreferredencoding(False) कॉल का परिणाम), जो आमतौर पर सही कोडक नहीं होगा यदि आपके कोड को पोर्टेबल होना आवश्यक है।

+0

पहली बार कोशिश करें कि यह काम नहीं कर रहा है, मुझे वही समस्याएं मिलती हैं जब मैंने str() का उपयोग किया, यानी मैं '\ r \ n \ xef \ xbb \ xbf' जैसी लाइनों के साथ समाप्त होता हूं। मैं देखूंगा कि मैं उन सुझावों के साथ क्या कर सकता हूं। – BeanBagKing

+1

@ बीनबैंकिंग: 'बी' \ xef \ xbb \ xbf'' आप देखते हैं बाइट्स मान का प्रतिनिधित्व है; इसका मतलब है कि आप 'str (bytevalue)' के परिणामस्वरूप गुजर रहे हैं, इनपुट फ़ाइल से डीकोड किए गए यूनिकोड स्ट्रिंग मान नहीं। –

+0

सही, किसी भी तरह से मेरी मूल फ़ाइल उन मानों के साथ ओवरराइट की गई थी। मुझे अभी भी आपके द्वारा दिए गए कोड के साथ त्रुटियां आ रही हैं, 'यूनिकोडडेकोड एरर:' आकर्षण 'कोडेक स्थिति 1563 में बाइट 0x90 को डीकोड नहीं कर सकता: cha पर रेक्टर मानचित्र। अगर मैं बाइट मोड में फ़ाइल खोलता हूं तो मुझे 'लंबाई 1 की अपेक्षित स्ट्रिंग मिलती है, लेकिन int मिली' क्या यह मेरी मूल फ़ाइल के एन्कोडिंग के साथ एक और मौलिक समस्या हो सकती है? – BeanBagKing

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