5

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

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

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

但是,如果我使用超过 20 行的文件,该文件将打开,但在几次迭代中,我得到一个 ValueError: I/O operation on a closed file。

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

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

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

4

2 回答 2

4

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

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

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

于 2011-06-15T23:44:44.490 回答
-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/

于 2013-10-26T15:22:25.283 回答