2013-07-20 6 views
5

मैं पूरी फ़ाइल को मेमोरी में पूरा करने की कोशिश कर रहा हूं (किया गया - स्ट्रिंगियो का उपयोग करके) - लेकिन ये ऑब्जेक्ट वास्तव में वास्तव में 'वास्तविक' फ़ाइलों की तरह व्यवहार नहीं करते हैं, जहां तक ​​मैं देख सकता हूं - मुझे पूरी सामग्री मिलती है, या मैं कर सकता हूं एक समय में एक लाइन पढ़ते हैं, लेकिन मैं बाहर काम नहीं कर सकते कि इस पद्धति लागू करने के लिए:स्मृति फ़ाइल पढ़ने के लिए सीएसवी रीडर कैसे प्राप्त करें?

import csv 
with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
     for row in spamreader: 

वहाँ सिर्फ एक डिस्क पर फ़ाइल की तरह एक memoryfile के इलाज का एक रास्ता है, तो मैं अच्छे मुहावरे का उपयोग कर सकते ऊपर ?

Python 2.7.4 (default, Apr 19 2013, 18:28:01) 

संपादित करें: इस पर जवाब के लिए धन्यवाद - मुझे लगता है कि मैं को संकुचित होता है कि मुझे क्या भ्रामक था ... लेकिन मैं अभी भी एक मुद्दा यहाँ है, निम्नलिखित नहीं करता उत्पादन कुछ भी? मुझे फ्लशिंग पर संदेह है?

from csv import reader, writer 
import StringIO 

memfile=StringIO.StringIO() 
spamwriter = writer(memfile) 
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) 
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 
spamreader=reader(memfile) 
for row in spamreader: 
     print ', '.join(row) 
memfile.close() 

संपादित करें # 2: लेकिन मैं गलत पेड़ मुझे लगता है कि ऊपर भौंकने कर रहा हूँ: मैं इस की डिस्क पर संस्करण काम करने के लिए या तो नहीं मिल सका ('IOError: फ़ाइल को पढ़ने के लिए खोल नहीं' - जब मैं पहले से ही खुली फ़ाइल पर पढ़ता हूं ...) संपादित करें # 3: स्ट्रिंगियो को छोड़ दिया गया है (इसके लिए कोई वास्तविक आवश्यकता नहीं है) - उत्तर के अनुसार स्प्लिटललाइन का उपयोग किया जाता है।

मैं यहां कोड और टिप्पणियां छोड़ दूंगा - अगर यह उपयोगी हो। (भले ही यह एक cul-de-sac है)।

+0

सालों बाद, मुझे लगता है कि आपने अपना प्रश्न अपडेट किया है; आपका अपडेट विफल हो जाता है क्योंकि आप * 0 * पर वापस आना भूल गए हैं। –

उत्तर

9

आप स्मृति में एक पूरी फ़ाइल को पढ़ने चाहते हैं, और यह पाठ है, तो आप एक StringIO ऑब्जेक्ट को खोलने की जरूरत नहीं है। बस इसे एक स्ट्रिंग के रूप में पढ़ें!

with open(filename, 'r') as file: 
    in_memory_file = file.read() 

तो फिर तुम splitlines का उपयोग जिस तरह से आप एक खुला पाठ फ़ाइल से अधिक पुनरावृति होगी इस पर पुनरावृति कर सकते हैं।

spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|') 
for row in spamreader: 
    pass 
+0

असल में यह ठीक से करने की कोशिश कर रहा है (मैं पहली बार ऑन-डिस्क फ़ाइल से पढ़ रहा हूं और इन-मेमोरी फ़ाइल में कॉपी कर रहा हूं) - मैं इसे जाने दूंगा - धन्यवाद। – monojohnny

+0

युप - बहुत अच्छा - जब से मैं पढ़ने() -> readlines() -> खुले मुहावरे से उपयोग करने के बाद से चला गया कि मैं splitlines के बारे में सब भूल गया :) StringIO overkill था! चियर्स – monojohnny

4

StringIO वस्तु को खोलने के लिए कोई जरूरत नहीं है, यह पहले से ही है एक खुले फ़ाइल वस्तु:

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|') 

सब csv.reader() जरूरतों एक iterable वस्तु है। एक StringIO ऑब्जेक्ट उस आवश्यकता को फिट करता है।

डेमो:

>>> from StringIO import StringIO 
>>> data = StringIO('1,2,3\n4,5,6\n') 
>>> import csv 
>>> for row in csv.reader(data): 
...  print row 
... 
['1', '2', '3'] 
['4', '5', '6'] 

अपनी खुद की StringIO.StringIO परीक्षण के लिए के रूप में, आपने फ़ाइल ऑब्जेक्ट को लिखा था लेकिन शुरुआत में वापस जाने के लिए उपेक्षित किया गया था; फाइल पॉइंटर अभी भी अंत में कोई डेटा नहीं पढ़ा जाएगा। पीछे जाएं:

memfile.seek(0) 
spamreader=reader(memfile) 
संबंधित मुद्दे