【问题标题】:Using buffered reader for large .csv files, Python对大型 .csv 文件使用缓冲阅读器,Python
【发布时间】: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


【解决方案1】:

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

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

在此至少您不应该收到文件打开错误。

【讨论】:

  • 这样就成功打印了16k行文件的全部内容。
  • @Trey,因此它确认没有您预期的文件读取问题。
  • 我没有收到任何错误,它只是终止了。这个技巧解决了它。谢谢。
【解决方案2】:

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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-03-29
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多