为什么迭代对象在Python中没有长度?

时间:2011-09-13 00:47:40

标签: text python-3.x multiprocessing iterable chunking

我想我一直在改进我以前的问题。基本上,我需要将大文本(csv)文件分块以将片段发送到multiprocess.Pool。为此,我认为我需要在迭代对象中可以迭代线。 (见how to multiprocess large text files in 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

1 个答案:

答案 0 :(得分:3)

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

问题在于,如果文件长度为千兆字节,如果可以帮助,您可能不想读取它两次。

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

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

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

  1. 首先将整个文件缓冲到一个行数组中,然后将这些行传递给你的chunker
  2. 两次阅读,第一次丢弃所有数据,只记录行