使用缓冲读取器处理大规模.csv文件,Python
我正在尝试在一个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
这样做的话,至少你应该不会再遇到文件打开错误了。