Вы говорите, что хотите генератор, и поэтому простое решение - просто написать его напрямую, используя yield
. Возможно, что-то вроде этого (хотя можно улучшить структуру цикла кода):
def FileReader(filename, length):
with open(filename, 'r') as fin:
while True:
group = []
for i in range(length):
try:
group.append(next(fin).strip())
except StopIteration:
break
if not group:
break
yield group
Это, например, будет каждый раз выводить список из 8 строк:
for g in FileReader(filename, 8):
print(g)
Или вот альтернатива, которую я предпочитаю. Я собрал строительный блок итератора в духе itertools
, который группирует любые итерируемые в списки заданной длины. Затем вы можете применить это непосредственно к объекту файла, чтобы сделать то, что вы хотите:
import itertools
def group(iterable, length):
for key,group in itertools.groupby(
enumerate(iterable),
key=lambda elem : elem[0] // length):
yield [elem[1] for elem in group]
Таким образом, это можно затем использовать, чтобы просто обернуть объект файла следующим образом:
fin = open(filename, "r")
for g in group(fin, 8):
print([e.strip() for e in g])
Примечаниечто в этом случае, чтобы сохранить общность функции group
, я пропустил strip
и поэтому должен был сделать это в конце.