【发布时间】:2011-09-15 23:00:01
【问题描述】:
我正在尝试在 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。错误并不总是发生在同一行
【问题讨论】:
-
您使用 csv.Reader 并仅在阅读器中使用 for row 迭代:do_stuff() 是否会遇到同样的问题?遇到此类问题的文件相对较小。
-
是的,当我只使用
for row in reader时,我确实遇到了同样的错误 -
内存不足的可能性很小。其他进程是否对文件起作用?您是否以正确的模式打开文件?如果你使用一个 20 行的文件,你会得到预期的结果吗?在您上面的评论中,“发送串行数据包”是什么意思——I/O 错误是否可能来自该步骤而不是来自 CSV 阅读器本身?提供完整的回溯总是好的。
-
您的 CSV 文件很小。该错误与大小无关。它可能与 CSV 文件完全无关。显示所有代码。显示完整的回溯。
-
@Russell - 文件上没有运行其他进程。使用 20 行文件我没有得到预期的(工作)结果。我的脚本还使用 pySerial 模块将串行数据包发送到嵌入式处理器,这就是我在评论中的意思。将尽快发布回溯...
标签: python csv bufferedreader enumerate