1

我想我一直在改进我之前的问题。基本上,我需要将一个大文本 (csv) 文件分块以将片段发送到 multiprocess.Pool。为此,我认为我需要在可迭代的对象中迭代行。(查看如何在 python 中多处理大型文本文件?

现在我意识到打开文本文件后的文件对象本身(或 _io.TextIOWrapper 类型)是可逐行迭代的,所以也许我的分块代码(现在在下面,抱歉之前错过它)可以分块它,如果它可以得到它的长度?但如果它是可迭代的,为什么我不能简单地调用它的长度(按行,而不是字节)?

谢谢!

def chunks(l,n):
    """Divide a list of nodes `l` in `n` chunks"""
    l_c = iter(l)
    while 1:
        x = tuple(itertools.islice(l_c,n))
        if not x:
            return
        yield x
4

1 回答 1

3

文件可迭代的原因是它们是按顺序读取的。除非处理整个文件,否则无法计算文件的长度(以行为单位)。(文件的字节长度并不表示它有多少行。)

问题是,如果文件是千兆字节长,如果可以得到帮助,您可能不想阅读它两次。

这就是为什么最好不知道长度;这就是为什么人们应该将数据文件作为一个Iterable而不是一个有长度的集合/向量/数组来处理。

您的分块代码应该能够直接处理文件对象本身,而无需知道其长度。

但是,如果您想在完全处理之前知道行数,您的 2 个选项是

  1. 首先将整个文件缓冲到一个行数组中,然后将这些行传递给您的分块器
  2. 读了两遍,第一次丢弃所有数据,只记录行
于 2011-09-13T00:51:43.273 回答