Разделение текста на фрагменты по 5 строк, а затем работа над каждым

Я пытаюсь написать программу, которая возьмет текстовый файл, организованный в 5 блоков строк, и разрежет весь текст на эти блоки для отдельной работы.

На данный момент я пытаюсь использовать:

text = open(filename).readlines()
chunk5 = zip(*(iter(text),) * 5)

for lines in chunk5:
    line = re.split('\n', text) # split a chunk into lines by line break
    # ...more statements

Пожалуйста, извините меня, потому что я полный новичок, но это правильный путь? Мне кажется, что в чанке5 чего-то не хватает в строке для строк в чанке 5, которая указывала бы, с каким чанком я работаю.

Как бы я также заставил программу пройтись по каждому фрагменту, пока он не закончит со всеми фрагментами в тексте?


person user1359892    schedule 26.04.2012    source источник
comment
Зачем группировать его в куски, а затем снова разбивать на строки?   -  person Gareth Latty    schedule 27.04.2012
comment
Ах, причина, по которой он снова разбивается на ложь, заключается в том, что в конечном итоге в каждом фрагменте из 5 строк я создаю список из строк 1 и 2, где каждое слово в этих строках соответствует друг другу. После этого я заархивирую их в словарь совпадающих ключей и значений, чтобы добавить их в большой словарь для всего текста.   -  person user1359892    schedule 27.04.2012
comment
@user: В этом случае вы не хотите разбивать text. Может быть, вы хотите разделить lines[0] и lines[1] или что-то в этом роде.   -  person Niklas B.    schedule 27.04.2012


Ответы (1)


Я всегда люблю генераторы для таких задач:

def chunkN(lines, N):
    acc = []
    for line in lines:
        acc.append(line)
        if len(acc) == N:
             yield acc
             acc = []
    if len(acc): # remainder
        yield acc

# Now you can do this...
for chunk in chunkN(open('myfile', 'r'), 5):
    print '-' * 80
    print ''.join(chunk)

Я оставлю параметризацию размера фрагмента и доступ к остальным

person Triptych    schedule 26.04.2012
comment
Также проверьте функцию grouper из здесь. Он короче и не использует временные списки. - person Niklas B.; 27.04.2012