Text 为什么iterable对象在Python中没有长度?

Text 为什么iterable对象在Python中没有长度?,text,python-3.x,multiprocessing,iterable,chunking,Text,Python 3.x,Multiprocessing,Iterable,Chunking,我想我在不断改进我之前的问题。基本上,我需要将一个大的文本(csv)文件分块以将片段发送到multiprocess.Pool。要做到这一点,我想我需要一个iterable对象,在这个对象中可以迭代行。 (见附件) 现在我意识到,打开文本文件后,文件对象本身(或_io.TextIOWrapper类型)是可逐行读取的,因此,如果可以获取其长度,我的分块代码(现在在下面,很抱歉之前遗漏了它)可能可以分块?但如果它是可编辑的,为什么我不能简单地调用它的长度(按行,而不是字节) 谢谢 def chunks

我想我在不断改进我之前的问题。基本上,我需要将一个大的文本(csv)文件分块以将片段发送到multiprocess.Pool。要做到这一点,我想我需要一个iterable对象,在这个对象中可以迭代行。 (见附件)

现在我意识到,打开文本文件后,文件对象本身(或_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

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

问题是,如果文件的长度为千兆字节,如果有帮助的话,您可能不想将其读取两次

这就是为什么最好不知道长度;这就是为什么我们应该将数据文件处理为
Iterable
,而不是具有长度的集合/向量/数组

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

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

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

  • 谢谢我希望,如果8个内核最终以先计数行为代价完成实际工作,我将获得更多。如果不知道在一个块中放入多少行并发送到一个核心,我看不到一种方法可以让我的块工作。我希望这是我在py3k中能获得的最好成绩: