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

mon*_*nny 6 python csv file-io

我正在尝试将整个文件提取到内存中(完成 - 使用StringIO) - 但据我所知,这些对象的行为并不像'真实'文件那样 - 我得到了全部内容,或者我可以阅读一次一行,但我无法弄清楚如何应用这种模式:

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

有没有办法像磁盘文件一样处理内存文件,所以我可以使用上面更好的习语?

Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢你的答案 - 我想我已经缩小了令我困惑的事情...但我仍然有一个问题,以下没有输出任何东西?我怀疑潮红?

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()
Run Code Online (Sandbox Code Playgroud)

编辑#2:但是我正在咆哮错误的树我想:我无法使磁盘上的版本也工作('IOError:文件没有打开阅读' - 当我打电话给已读的时候打开文件...)编辑#3:放弃了StringIO(没有真正的需要) - 根据答案使用了分割线.

我会在这里留下代码和评论 - 以防它有用.(即使它是一个死胡同).

llb*_*llb 11

如果要将整个文件读入内存及其文本,则无需打开StringIO对象.只需将其作为字符串阅读!

with open(filename, 'r') as file:
    in_memory_file = file.read()
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用splitlines迭代方式迭代打开的文本文件.

spamreader = csv.reader(in_memory_file.splitlines(), delimiter=' ', quotechar='|')
for row in spamreader:
    pass
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

没有必要打开StringIO对象,它已经是一个打开的文件对象:

spamreader = csv.reader(MYMEMORYFILE_HERE, delimiter=' ', quotechar='|')
Run Code Online (Sandbox Code Playgroud)

所有csv.reader()需要的是一个可迭代的对象.一个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']
Run Code Online (Sandbox Code Playgroud)

至于你自己的StringIO.StringIO考试; 你写了一个文件对象,却忽略了回到起点; 由于文件指针仍在结尾,因此不会读取任何数据.回头看:

memfile.seek(0)
spamreader=reader(memfile)
Run Code Online (Sandbox Code Playgroud)