我想我一直在改进我以前的问题。基本上,我需要将大文本(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
答案 0 :(得分:3)
文件可迭代的原因是它们是串行读取的。除非处理整个文件,否则无法计算文件的长度(以行为单位)。 (文件的长度(以字节为单位)并不表示它有多少行。)
问题在于,如果文件长度为千兆字节,如果可以帮助,您可能不想读取它两次。
这就是为什么不知道长度更好的原因;这就是为什么人们应该将数据文件作为Iterable
而不是具有长度的集合/向量/数组来处理。
您的分块代码应该能够直接处理文件对象本身,而不知道它的长度。
然而如果你想在完全处理之前知道行数,你的2个选项是