2013-03-08 5 views
6

मैं अजगर सीएसवी रीडर का उपयोग करना चाहते हैं, लेकिन मैं में उद्धरण छोड़ना चाहते हैं यही कारण है कि मैं चाहता हूँ है:।क्या पाइथन का सीएसवी रीडर उद्धरण छोड़ सकता है?

>>> s = '"simple|split"|test' 
>>> reader = csv.reader([s], delimiter='|', skipinitialspace=True) 
>>> reader.next() 
['"simple|split"', 'test'] 

लेकिन मैं वास्तव में मिलती है:

['simple|split', 'test'] 

मेरे मामले में मैं उद्धृत चाहते स्ट्रिंग अभी भी उद्धृत पर पारित किया जाना है।

मुझे पता है कि सीएसवी रीडर इरादे के रूप में काम कर रहा है और मेरा उपयोग मामला इसका दुरुपयोग है, लेकिन क्या मेरी इच्छा को झुकाव करने का कोई तरीका है? या मुझे अपना खुद का स्ट्रिंग पार्सर लिखना है?

+0

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

+1

डेटा कितना जटिल है, इस पर निर्भर करता है कि आप धोखा देने और 'फ़िल्टर (कोई नहीं, re.split (आर '("। *? ") | \ |', एस) जैसे कुछ भयानक उपयोग करने में सक्षम हो सकते हैं)' - या देखो 'pyparsing' में –

+0

हैलो, मैंने एक उत्तर पोस्ट किया जिसमें वास्तव में मैं विकसित हुआ कि मार्टजिन और जॉन ने क्या कहा है। क्या आप कृपया कह सकते हैं कि आपने रेगेक्स का उपयोग क्यों नहीं किया? – eyquem

उत्तर

3

आपने मॉड्यूल कि पार्स करने और उद्धरण पीठ चीजों के सी पक्ष में है के भाग के रूप, अपने खुद के पार्सर लिखने के लिए करने जा रहे हैं, विशेष रूप से parse_process_charModules/_csv.c में स्थित में:

else if (c == dialect->quotechar && 
      dialect->quoting != QUOTE_NONE) { 
     if (dialect->doublequote) { 
      /* doublequote; " represented by "" */ 
      self->state = QUOTE_IN_QUOTED_FIELD; 
     } 
     else { 
      /* end of quote part of field */ 
      self->state = IN_FIELD; 
     } 
    } 
    else { 
     /* normal character - save in field */ 
     if (parse_add_char(self, c) < 0) 
      return -1; 
    } 

कि "क्षेत्र के उद्धरण भाग का अंत" खंड है जो आपके डबल कोट को चूम रहा है। दूसरी ओर, आप उस else सशर्त को मारने और पाइथन स्रोत कोड का पुनर्निर्माण करने में सक्षम हो सकते हैं। हालांकि यह ईमानदार होने के लिए बनाए रखने योग्य नहीं है।

संपादित:। खेद है कि मैं पिछले else से बिट जोड़ने से पहले self->state = IN_FIELD तो यह में बोली कहते हैं

+0

यह एक बहुत ही निश्चित उत्तर है! धन्यवाद। –

+0

@ हैमिशडाउनर असल में मुझे पीपीपी (पायथन में पायथन) के मॉड्यूल का उपयोग करने और इसे एक कस्टम बनाने के लिए संशोधित करने के बारे में एक विचार था जिसे एक परियोजना में गिराया जा सकता है। मैं इसके साथ खिलौना करने जा रहा हूं और देख सकता हूं कि मैं इसे काम करने के लिए प्राप्त कर सकता हूं ताकि आपको किसी भी पहिये का पुन: आविष्कार न करना पड़े। – cwgem

+1

@ हैमिशडाउनर हाँ मैंने इसे एक शॉट दिया लेकिन पीपीपी का सीएसवी मॉड्यूल कोड, यहां तक ​​कि अजगर में भी है, अभी भी बहुत सारे गंदे आयात बिखरे हुए हैं। दुर्भाग्य से थोड़ा अधिक प्रयास होगा। हो सकता है कि वे अपने [सीएसवी रीडर कोड] (https://bitbucket.org/pypy/pypy/src/5a61eff6b57fa1bfa95bd0d04e4a9421dab987ce/pypy/module/_csv/interp_reader.py) पर नज़र डालें, वैसे भी अगर आपको संभालने के तरीके पर कुछ विचारों की आवश्यकता है पार्सर काम – cwgem

2

यदि आप क्या आप प्राप्त करने के लिए कोशिश कर रहे हैं की साफ होता है मुझे समझ नहीं आता था।
आप कहते हैं "मुझे पता है (...) मेरा उपयोग केस दुरुपयोग है"
लेकिन दुर्व्यवहार का तात्पर्य है कि उपयोग की संभावना मौजूद है।
हालांकि, आपके मामले में, कोई संभावित उपयोग नहीं है, जिसे आपने "वर्णित" असंभव है क्योंकि सीएसवी पार्सर को जो पास किया गया है वह वैध सीएसवी प्रारूप का होना चाहिए और आपका नहीं है।

एक CSV मान्य स्ट्रिंग में, अधिकांश वर्ण जानकारी हैं और कुछ वर्ण जानकारी निकालने के लिए स्ट्रिंग की व्याख्या करने के लिए मेटा-सूचना आवश्यक हैं।
आप जो वर्णन करते हैं वह यह है कि आप चाहते हैं कि वर्ण " सूचना श्रेणी और मेटा-सूचना श्रेणी में पूरी तरह से हो। ऐसा लगता है कि कोई व्यक्ति अपने बाएं हाथ को अपने बाएं हाथ से पकड़ना चाहता है .....

यह समस्या आपकी स्ट्रिंग के साथ हो रही है क्योंकि यह एक CSV फ़ाइल पढ़ने से आने वाली स्ट्रिंग नहीं है। यह एक स्ट्रिंग है जैसा लिखा है।
सीएसवी फ़ाइल के पढ़ने से इस तरह की एक स्ट्रिंग प्राप्त करना असंभव है, क्योंकि यह CSV फ़ाइल में इस तरह लिखा नहीं जा सका।
तो एक CSV फ़ाइल में लिखा है, '"simple|split"|test'

  • """simple|split"""|test
    लिखा जा सकता है

  • या #"simple#|split#"|test
    doublequote = False, escapechar = '#'

साथ सही पर doublequote सेट, डिफ़ॉल्ट के साथ।

आप जानकारी निकालने के लिए जैसे आप वर्णित है, यदि आप एक पार्सर बनाने के लिए नहीं है, तो आप सिर्फ एक पहले से ही विद्यमान उपकरण का उपयोग करने के लिए है चाहते हैं:

import re 

reg = re.compile('".*?"|[^|]+') 

print reg.findall('yoo|"simple|split"|test|end"pos|hu') 

परिणाम

['yoo', '"simple|split"', 'test', 'end"pos', 'hu'] 
संबंधित मुद्दे