2013-09-25 2 views
8

मैं अजगर में बड़ी संख्या में CSV फ़ाइलों को संसाधित कर रहा हूं। फाइलें बाहरी संगठनों से प्राप्त की जाती हैं और एन्कोडिंग की एक श्रृंखला के साथ एन्कोड की जाती हैं। मैं एक स्वचालित विधि को खोजने के लिए निम्नलिखित निकालना चाहते हैं:टेक्स्ट फ़ाइलों से गैर-प्रिंट करने योग्य "gremlin" वर्णों को हटा रहा है

  • गैर- ASCII वर्ण
  • नियंत्रण वर्ण
  • अशक्त (ASCII 0) वर्ण

मैं एक उत्पाद कहा जाता है 'का पता लगाएं और इसे बदलें! जो नियमित अभिव्यक्तियों का उपयोग करेगा, इसलिए नियमित अभिव्यक्ति के साथ उपरोक्त को हल करने का एक तरीका बहुत उपयोगी होगा।

धन्यवाद

+0

'फाइलें बाहरी संगठनों से प्राप्त की जाती हैं और एन्कोडिंग की एक श्रृंखला के साथ एन्कोड की जाती हैं' - और वे हैं ... उनसे पूछें नहीं? इसके साथ आपके संबंधित उत्पाद को क्या करना है? आप डेटा का उपयोग करने की क्या कोशिश कर रहे हैं ... क्या आपको वास्तव में पाइथन की आवश्यकता है? –

+0

अच्छे प्रश्न। सीएसवी फाइलें एन्कोडिंग में 'अज्ञात' (ढूँढें और इसे बदलें!), 'Utf-8', 'iso-88591-1' और अन्य शामिल हैं। उनसे नहीं पूछ सकता - बहुत अधिक ईमेल, बहुत लंबा। मैंने पहले ही पाइथन लिखा है जो सीएसवी फाइलों को दोबारा सुधारता है। और स्क्रिप्ट अधिकांश मामलों में काम करती है, सिवाय इसके कि जहां gremlins (जो किसी भी तरह के बराबर करते हैं \ r) गड़बड़ CSV.reader। गैर-एसिसी को हटाकर एन्कोडेड मुझे सॉर्ट करेगा। चीयर्स! –

+0

इन सभी टिप्पणियों के लिए धन्यवाद। काम पूरा करने के लिए भीड़ में मैंने बीबीईडीआईटी नामक कुछ चीज का उपयोग किया है जो 'gremlins' को हटा देगा जैसे आर/अक्षरों को एक एन्कोडिंग के साथ एन्कोड किया गया है जिसे पायथन पहचान नहीं है (आगे के काम के बिना)। अब जब मैं जानता हूं कि BBEdit का उपयोग करके इन gremlins की पहचान कैसे करें, मैं जांच करूंगा कि नीचे दिए गए कोई भी समाधान एक ही काम करते हैं और पहले जवाब को चेक करते हैं। –

उत्तर

5

एक वैकल्पिक आप में रुचि हो सकती होगा:

import string 
clean = lambda dirty: ''.join(filter(string.printable.__contains__, dirty)) 

यह बस गंदा स्ट्रिंग यह प्राप्त करता है से सभी प्रिंट न हो सकने पात्रों को फ़िल्टर कर देता।

>>> len(clean(map(chr, range(0x110000)))) 
100 
5

इस प्रयास करें:

clean = re.sub('[\0\200-\377]', '', dirty) 

विचार (यानी \ 0 और उन है कि 7 बिट्स में फिट नहीं है) प्रत्येक NUL या "उच्च ASCII" चरित्र से मेल खाते हैं और उन्हें हटाने के लिए है । आप एएससीआईआई ईएससी या बीईएल जैसे अधिक पात्र जोड़ सकते हैं।

या इस:

clean = re.sub('[^\040-\176]', '', dirty) 

विचार केवल की सीमित रेंज की अनुमति के लिए जा रहा है "प्रिंट योग्य ASCII," लेकिन ध्यान दें कि यह नई-पंक्तियों को हटा। यदि आप न्यूलाइन या टैब या जैसे रखना चाहते हैं, तो उन्हें केवल ब्रैकेट में जोड़ें।

+0

धन्यवाद। कोशिश करेंगे और आज वापस आओगे। मुझे बनाए रखने के लिए टैब की आवश्यकता नहीं है, लेकिन मुझे एन्कोड किए जाने के लिए न्यूलाइन (और उम्मीद है कि सीएसवी बाड़ों के भीतर वैध सीआरएस) की आवश्यकता है। –

2

कुछ भी है कि (इसे हटा) एक खाली साथ एक वांछनीय चरित्र नहीं है बदलें:

clean = re.sub('[^\s!-~]', '', dirty) 

यह सब खाली स्थान के (रिक्त स्थान, नई-पंक्तियों, टैब आदि) की अनुमति देता है, और सभी "सामान्य" वर्ण (! पहला एसीआई प्रिंट करने योग्य है और ~ दशमलव 128 के तहत अंतिम असीसी प्रिंट करने योग्य है)।

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