2011-01-31 4 views
5

मेमोरी से सीएसवी डेटा पार्सिंग क्या पाइथन में सीएसवी डेटा को पार्स करने का कोई तरीका है जब डेटा फ़ाइल में नहीं है? मैं अपने डेटाबेस में सीएसवी डेटा संग्रहीत कर रहा हूं और मैं इसे पार्स करना चाहता हूं। मैं रूबी के CSV.parse के समान कुछ ढूंढ रहा हूं। मुझे पता है कि पाइथन के पास CSV वर्ग है लेकिन दस्तावेज़ों में जो कुछ भी मैंने देखा है, वह इन-मेमोरी सीएसवी डेटा के विपरीत फाइलों से निपटने लगता है।पाइथन

(और यह डेटा पार्स करने के लिए इससे पहले कि यह डेटाबेस में चला जाता है के लिए एक विकल्प नहीं है।)

(और मुझे मत बताओ कृपया डेटाबेस में सीएसवी डाटा स्टोर करने के लिए नहीं। मैं जानता हूँ कि मैं क्या कर रहा हूँ जहां तक ​​डेटाबेस चला जाता है।)

+0

"मैं अपने डेटाबेस में सीएसवी डेटा संग्रहीत कर रहा हूं और मैं इसे पार्स करना चाहता हूं।" यह संदिग्ध है। क्या आप एक संपूर्ण सीएसवी फ़ाइल को डेटाबेस में ग्लोब या स्ट्रिंग के रूप में संग्रहीत कर रहे हैं? क्या आपका मतलब है कि आप डेटाबेस में किसी तालिका में जानकारी के सभी टुकड़े संग्रहित कर रहे हैं, जहां प्रत्येक कॉलम एक CSV फ़ील्ड के अनुरूप होगा? – gotgenes

+0

मैं पूरी फ़ाइल को एक ब्लॉब के रूप में संग्रहीत कर रहा हूं। –

+1

बीएलओबी की संरचना क्या है? क्या आपके पास डेटा को चुनने का विकल्प है? – jbcurtin

उत्तर

7

पाइथन csv मॉड्यूल के बारे में फ़ाइलों के लिए कोई विशेष भेद नहीं है। आप फ़ाइल स्ट्रिंग ऑब्जेक्ट्स के रूप में अपने तारों को लपेटने के लिए StringIO का उपयोग कर सकते हैं। फ़ाइल की वस्तुओं और सूची वस्तुओं दोनों उपयुक्त हैं -

+3

[cStringIO] (http://docs.python.org/library/stringio.html#module-cStringIO) ज्यादातर मामलों में अधिक उपयुक्त है। – gotgenes

1

stringio मॉड्यूल का उपयोग करें, जो आपको स्ट्रिंग को फ़ाइल जैसी वस्तुओं के रूप में तैयार करने की अनुमति देता है। इस तरह आप पार्सिंग (या किसी अन्य पार्सर का उपयोग कर रहे हैं) के लिए CSV मॉड्यूल में stringio "फ़ाइल" पास कर सकते हैं।

1

http://docs.python.org/library/csv.html

csv.reader(csvfile) 

csvfile किसी भी वस्तु जो इटरेटर प्रोटोकॉल का समर्थन करता है और हर बार अपनी अगली() विधि कहा जाता है एक स्ट्रिंग रिटर्न हो सकता है ।

यदि आपके पास उदा। एक स्ट्रिंग में डीबी से सामग्री आप इसे पसंद

import csv 

fromDB = "1,2,3\n4,5,6" 

reader = csv.reader(fromDB.split("\n")) 
for row in reader: 
    print("New row") 
    for col in row: 
    print(" ", col) 
+0

-1 क्योंकि आपका उत्तर दस्तावेज़ों से एक साधारण आरटीएफएम-कोट है, इस बारे में कोई और व्याख्या नहीं है कि यह कैसे उपयोगी है या कैसे। और यह ओपी प्रश्न –

+0

का उत्तर नहीं देता @ मार्टिन थुरौ ने उदाहरण जोड़ा (डीबी भाग छोड़ना, नवीनतम टिप्पणी के अनुसार फ़ाइल सामग्री स्वयं डेटाबेस में सहेजी गई है और एकल पंक्तियां नहीं) – Howard

+0

यह बेहतर है। अच्छा लड़का;) –

1

यहाँ कारण है कि आप (अजगर 3.x में io.StringIO) cStringIO.StringIO का उपयोग करना चाहिए पार्स कर सकते हैं कुछ DIY kludge के बजाय:

>>> import csv 
>>> from cStringIO import StringIO 
>>> fromDB = '"Column\nheading1",hdng2\r\n"data1\rfoo","data2\r\nfoo"\r\n' 
>>> sources = [StringIO(fromDB), fromDB.splitlines(True), 
...  fromDB.splitlines(), fromDB.split("\n")] 
>>> for i, source in enumerate(sources): 
...  print i, list(csv.reader(source)) 
... 
0 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
1 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
2 [['Columnheading1', 'hdng2'], ['data1foo', 'data2foo']]   # 3 errors 
3 [['Columnheading1', 'hdng2'], ['data1\rfoo', 'data2\rfoo'], []] # 3 errors 
>>> 

का उपयोग guff.splitlines(True) है अनुशंसित नहीं है क्योंकि StringIO(guff) से कहीं अधिक संभावना है कि जो कोई भी आपके कोड को पढ़ रहा है, उसके पास कोई संकेत नहीं होगा कि यह क्या करता है।