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

5 投票
2 回答
9836 浏览
提问于 2025-04-16 19:39

我正在尝试在一个Python脚本中打开大型的.csv文件(超过16000行,约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 个回答

-2

csv_reader 更快。它会把整个文件分成块来读取。为了避免内存泄漏,最好使用子进程。
你可以从 multiprocessing 这个模块中导入 Process。

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/

4

对于3GB的内存来说,16,000行代码根本不算什么。你遇到的问题很可能是别的原因,比如你在其他某个过程上花了太多时间,这可能会影响到你打开的文件。为了确保顺利运行,而且在3GB内存的情况下,为了提高速度,建议你把整个文件加载到内存中,然后再进行解析,比如:

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

这样做的话,至少你应该不会再遇到文件打开错误了。

撰写回答