2011-06-15 55 views
4

我试图在python脚本中打开大型的.csv文件(16k行+〜〜15列),并遇到一些问题。使用缓冲读取器的大型.csv文件,Python

我使用内置的open()函数打开文件,然后使用输入文件声明csv.DictReader。循环的结构是这样的:

for (i, row) in enumerate(reader): 
    # do stuff (send serial packet, read response) 

但是,如果我使用一个文件比约20线长,该文件将打开,但有几个迭代中,我得到一个ValueError:I/O操作上一个关闭的文件。

我的想法是我可能内存不足(尽管16k行文件只有8MB,而我有3GB的内存),在这种情况下,我希望我需要使用某种缓冲区来加载只有文件的一部分一次进入内存。

我在正确的轨道上吗?或者是否还有其他原因导致文件意外关闭?

编辑:大约一半的时间我用11行csv来运行它,它给了我ValueError。错误并不总是发生在同一行

+0

你是否使用csv.Reader获得相同的问题,并且只是在reader中对行进行迭代:do_stuff()?这是一个相对较小的文件,会遇到这种类型的问题。 – 2011-06-15 22:53:12

+0

是的,我确实有同样的错误,当我只使用阅读器中的行时 – Trey 2011-06-15 23:01:48

+2

这是不太可能,你内存不足。其他进程是否在文件上运行?你是否以正确的模式打开文件?如果你使用20行文件,你会得到预期的结果吗?在上面的评论中,“发送串行数据包”的含义是什么?I/O错误是否可能来自该步骤,而不是来自CSV阅读器本身?提供完整的回溯总是好的。 – 2011-06-15 23:11:29

回答

4

对于3GB Ram,16k线是没有用的,很可能你的问题是其他问题,例如,您在其他一些干扰打开的文件的过程中花费了太多时间。为了确保速度,当你有3GB内存时,将整个文件加载到内存中,然后解析

import csv 
import cStringIO 
data = open("/tmp/1.csv").read() 
reader = csv.DictReader(cStringIO.StringIO(data)) 
for row in reader: 
    print row 

在这至少你不应该得到文件打开错误。

+0

这将成功打印16k行文件的全部内容。 – Trey 2011-06-16 21:35:46

+0

@Trey,所以它确认没有像您期待的那样的文件读取问题。 – 2011-06-16 22:53:18

+0

我没有收到任何错误,只是终止。这个提示修复了它。谢谢。 – PhoebeB 2012-05-01 20:48:10

-1

csv_reader更快。将整个文件读取为块。为了避免内存泄漏更好地使用子进程。 从多进口过程

def child_process(name): 
    # Do the Read and Process stuff here.if __name__ == '__main__': 
    # Get file object resource. 
     ..... 
    p = Process(target=child_process, args=(resource,)) 
    p.start() 
    p.join() 

欲了解更多信息,请访问通过这个环节。 http://articlesdictionary.wordpress.com/2013/09/29/read-csv-file-in-python/

+0

为什么是csv_reader?您的链接已损坏... – 2015-10-16 11:46:48