使用缓冲读取器来处理大型.csv文件,Python

时间:2011-06-15 22:47:28

标签: python csv bufferedreader enumerate

我正在尝试在python脚本中打开大型.csv文件(16k行+,~15列),并且遇到了一些问题。

我使用内置的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。错误并不总是发生在同一行

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:-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/