【问题标题】:How to get CSV reader to read a memory file?如何让 CSV 阅读器读取内存文件?
【发布时间】:2013-07-20 22:40:55
【问题描述】:

我正在尝试将整个文件提取到内存中(完成 - 使用 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()

EDIT#2:但是我想错了树:我也无法让磁盘上的版本工作('IOError: File not open for reading' - 当我调用 read在已经打开的文件上...) 编辑#3:放弃了 StringIO (不需要它) - 根据答案使用分割线。

我将把代码和 cmets 留在这里 - 以防万一有用。 (即使是死胡同)。

【问题讨论】:

  • 多年后,我看到你更新了你的问题;您的更新失败,因为您忘记了回溯到 0

标签: python csv file-io


【解决方案1】:

如果你想将整个文件读入内存,而且它是文本,你不需要打开一个 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 成语以来,我忘记了所有关于分割线的事情 :) StringIO 太过分了!干杯
【解决方案2】:

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

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

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']

至于你自己的StringIO.StringIO测试;你写了一个文件对象,但忽略了寻找开始;由于文件指针仍在末尾,因此不会读取任何数据。回溯:

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

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多