Python 如何让CSV阅读器读取内存文件?

Python 如何让CSV阅读器读取内存文件?,python,csv,file-io,Python,Csv,File Io,我正在尝试将整个文件提取到内存中(完成-使用StringIO)-但就我所见,这些对象的行为与“真实”文件的行为并不完全相同-我获得了全部内容,或者我可以一次读取一行,但我不知道如何应用此模式: import csv with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile: spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in sp

我正在尝试将整个文件提取到内存中(完成-使用StringIO)-但就我所见,这些对象的行为与“真实”文件的行为并不完全相同-我获得了全部内容,或者我可以一次读取一行,但我不知道如何应用此模式:

import csv 
with open(#MYMEMORYFILE_HERE#, 'rb') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for row in spamreader:
有没有一种方法可以像对待磁盘上的文件一样对待内存文件,这样我就可以使用上面更好的习惯用法

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:File not open for reading'-当我调用已经打开的文件上的read…) 编辑#3:放弃StringIO(没有真正的需要)-根据答案使用分割线


我将把代码和注释留在这里,以防有用。(即使是死胡同)。

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

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|')
csv.reader()
需要的只是一个iterable对象。
StringIO
对象符合该要求

演示:

至于你自己的
StringIO.StringIO
test;您写入了一个文件对象,但忽略了返回到起始位置;由于文件指针仍在末尾,因此不会读取任何数据。寻回:

memfile.seek(0)
spamreader=reader(memfile)

如果要将整个文件读取到内存中,并且是文本,则不需要打开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

事实上,这与我正在努力做的事情非常吻合(我第一次从磁盘上的文件读取,然后复制到内存中的文件)-我会尝试一下-谢谢。是的-太好了-自从我开始使用read()->readlines()->open习惯用法以来,我就完全忘记了splitlines:)StringIO太过分了!晚点,我看到你更新了你的问题;您的更新失败,因为您忘记查找回0。
spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|')
for row in spamreader:
    pass