Вы можете сделать это следующим образом:
from itertools import groupby
with open('test.txt') as f:
data = f.read().split('\n')
for ind, (_, g) in enumerate(groupby(data),1):
with open('{}.txt'.format(ind), 'w') as f:
f.write('\n'.join(g))
Объяснение:
Вы можете прочитать о группе Itertools здесь: https://docs.python.org/2/library/itertools.html#itertools.groupby.
Groupby вернет два элемента, ключ и группу.Поэтому, если мы хотим перебрать группу, мы бы сделали что-то вроде этого: for key, group in groupby(object):
или for k, g in groupby(object):
Теперь в этом случае ключи будут chicken, duck, parrot, chicken
, а группы будут ['chicken', 'chicken'] , ['duck','duck... ...]
Однако (теперь идет часть, где я объясняю ind, (_, g)
), чтобы получить индекс во время цикла, мы можем использовать функцию перечисления Python, которая будет возвращать индекс и итератор.Обычно это выглядит так: for index, item in enumerate(list):
или for ind, i in enumerate(list)
.
Теперь, допустим, мы хотим объединить enumerate
и groupby
.Тогда мы могли бы сделать это так: for index, (key, group) in enumerate(groupby(object)):
или более компактно: for ind, (_, g) ...
.Я использую _
в этом случае (и это Pythonic), чтобы сигнализировать, что я не заинтересован в переменной (ключ в этом случае).