2009-11-06 18 views
5

एक पीएमएल (पाम मार्कअप भाषा) फ़ाइल को ठीक करने की कोशिश में, ऐसा प्रतीत होता है कि मेरी टेस्ट फ़ाइल में गैर-ASCII वर्ण हैं जो मेकबुक को शिकायत कर रहा है। समाधान पीएमएल में सभी गैर-ASCII वर्णों को तोड़ना होगा।पाइथन का उपयोग करके विस्तारित एसीआईआई को कैसे हटाया जाए?

तो अजगर में इसे ठीक करने के प्रयास में, मैं

import unicodedata, fileinput 

for line in fileinput.input(): 
    print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 

है हालांकि, यह एक त्रुटि है कि रेखा होना चाहिए "यूनिकोड, str नहीं" का परिणाम है। यहां एक फ़ाइल खंड है।

\B1a\B \tintense, disordered and often destructive rage†.†.†.\t 

इस बिंदु पर संसाधित होने के लिए लाइन को सही ढंग से पास करने का तरीका बिल्कुल नहीं है।

+0

आप किसी भी चरित्र जिसका ASCII मूल्य 255 से भी बड़ा है को फ़िल्टर करना चाहते हैं? –

+0

कड़ाई से बोलते हुए, विस्तारित ASCII जैसी कोई चीज़ नहीं है। एएससीआईआई 0 से 127 के मानों को परिभाषित करता है। उससे अधिक कुछ भी मनमाने ढंग से व्याख्या किया जा सकता है। शायद आपको शब्द * गैर-ASCII वर्ण * का उपयोग करना चाहिए। – dreamlax

+0

संबंधित: टर्मिनल आउटपुट के लिए सुरक्षित बचाना फ़ंक्शन http://stackoverflow.com/questions/437476/safe-escape-function-for-terminal-output – jfs

उत्तर

0

पायथन में एक फ़ाइल से पढ़ने पर आपको पायथन स्ट्रिंग्स, उर्फ ​​"स्ट्र" पाइथन 2.x और इससे पहले में मिल रहा है। आपको decode विधि का उपयोग करके इन्हें "यूनिकोड" प्रकार में रूपांतरित करने की आवश्यकता है। उदाहरण:

line = line.decode('latin1') 

सही एन्कोडिंग के साथ 'latin1' को बदलें।

5

print line.decode('iso-8859-1').encode('ascii', 'ignore') आज़माएं - जो आप चाहते हैं उसके करीब होना चाहिए।

+0

ऐसा लगता है कि मेकबुक अब अवैध नियंत्रण कोड के बारे में शिकायत कर रहा है। –

+0

@Jauder, आप निश्चित रूप से नियंत्रण कोड भी हटा सकते हैं, उदाहरण के लिए उपरोक्त 'clean =' 'के बाद।शामिल हों (सी के लिए सी में सी के लिए सी (सी)> = 32) '(न्यूलाइन और कैरिज रिटर्न सहित सभी नियंत्रण कोड हटा देता है - स्वाद में समायोजित करें, हम वास्तव में यह नहीं जानते कि आप कौन से नियंत्रण कोड चाहते हैं हटाना!-)। –

+0

@Alex, अगर मुझे पता था, मैं = = होगा। समस्या यह है कि मैं बिना किसी स्रोत के जावा प्रोग्राम के साथ काम कर रहा हूं जो केवल एक गुप्त त्रुटि संदेश को छोड़ देता है। http://gist.github.com/227882 –

5

आप line ASCII संहिताबद्ध डेटा के रूप में इलाज के लिए चाहते हैं तो इस सवाल का जवाब यह डिकोड करने के लिए ascii कोडेक का उपयोग कर पाठ में है: कि वास्तव में नहीं है

line.decode('ascii')

इस डेटा के लिए त्रुटियों को बढ़ा देंगे ASCII संहिताबद्ध। यह उन त्रुटियों को अनदेखा करने का तरीका है:

line.decode('ascii', 'ignore')

यह आपको unicode उदाहरण के रूप में पाठ देता है।

line.decode('ascii', 'ignore').encode('ascii')

2

ड्रॉप करने के लिए: यदि आप इसके बजाय (ASCII संहिताबद्ध) टेक्स्ट के बजाय डेटा के साथ काम करेंगे, तो आप फिर से एनकोड सकता है इसे वापस पाने के लिए एक str या bytes उदाहरण (अजगर के अपने संस्करण के आधार पर) गैर-ASCII वर्ण line.decode(your_file_encoding).encode('ascii', 'ignore') का उपयोग करते हैं। लेकिन शायद आप बेहतर उनके लिए PLM भागने दृश्यों का उपयोग करेंगे:

import re 

def escape_unicode(m): 
    return '\\U%04x' % ord(m.group()) 

non_ascii = re.compile(u'[\x80-\uFFFF]', re.U) 

line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t' 
print non_ascii.sub(escape_unicode, line) 

यह आउटपुट \B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\t

गिराने नियमित अभिव्यक्ति के साथ गैर- ASCII और नियंत्रण वर्ण भी (यह सुरक्षित रूप से बचने के बाद इस्तेमाल किया जा सकता) आसान है:

regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]') 
regexp.sub('', line) 
संबंधित मुद्दे