2013-07-20 114 views
5

我试图将整个文件读入内存(完成 - 使用StringIO) - 但是,尽管我可以看到这些对象的行为完全不像'真正'文件 - 我获取了全部内容,或者我可以一次读取一条线,但我不能工作,如何应用此模式:如何让CSV阅读器读取内存文件?

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:但是我找错了树我想:我不能让上盘版的这个工作是(“IO错误:文件无法打开阅读” - 当我打开已经打开的文件上的读取...) 编辑#3:放弃了StringIO(没有真正需要它) - 根据答案使用分裂线。

我会在这里留下代码和评论 - 以防万一它有用。 (尽管它是一个死路)。

+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

是的 - 很好 - 自从我使用read() - > readlines() - >打开成语后,我忘记了所有关于分裂线的知识:) StringIO太过分了!干杯 – monojohnny

4

无需打开StringIO对象,它是已经一个打开的文件对象:

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

所有这一切csv.reader()需求是一个迭代的对象。 A 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)