如何用itertools实现可迭代对象(如文件)的固定大小分组迭代?
按固定行数迭代可迭代对象(无需全量加载)
你可以借助itertools.islice实现这个需求,不用把全部内容读入内存。下面是对应的实现函数:
from itertools import islice def ten_at_a_time_magic(iterable, chunk_size): iterator = iter(iterable) while True: # 每次从迭代器中取出最多chunk_size个元素 chunk = list(islice(iterator, chunk_size)) if not chunk: # 取不出元素时终止循环 break yield chunk
直接用你给出的场景测试:
with open("filename.txt") as source: for tenlinegroup in ten_at_a_time_magic(source, 10): # 示例:打印每组10行 print(''.join(tenlinegroup))
原理说明
- 文件对象本身就是迭代器,我们先把输入的可迭代对象统一转为迭代器,确保兼容所有可迭代类型;
islice会从迭代器中按指定数量取元素,且不会提前加载全部内容;- 每次取出的元素转成列表(如果不需要保存,也可以直接处理islice返回的迭代器),当chunk为空时,说明原迭代器已经耗尽,停止生成。
如果追求更简洁的写法,也可以结合itertools.takewhile:
from itertools import islice, takewhile def ten_at_a_time_magic(iterable, chunk_size): iterator = iter(iterable) return takewhile(bool, (list(islice(iterator, chunk_size)) for _ in iter(int, 1)))
内容的提问来源于stack exchange,提问作者alexis
相关产品推荐
相关产品推荐

