2016-12-07 4 views
1

Как и в названии - у меня много очень больших текстовых файлов (> 10 ГБ), которые имеют одинаковую повторяющуюся структуру. Я хотел бы отфильтровать некоторую информацию, поэтому я хотел бы дать каждую k-ю строку от них, но одновременно повторить их все. Я пробовал itertools: islice и izip, но я не могу их собрать ...Python: Итерации по многим большим файлам одновременно, получить каждую k-ю строку

+1

Включите вашу попытку; гораздо более продуктивно указывать вашу конкретную ошибку, чем повторять то, что вы уже выяснили. –

+0

Вы можете разделить эту задачу на три подзадачи, сначала - перебирать файлы с использованием многопроцессорности и хранить k-ые строки в отдельных файлах, во-вторых - объединить все файлы в один и, наконец, третье - выполнить итерацию на выходе второго шага и выход Результаты. – vovaminiof

+0

@vovaminiof: это тривиально разрешимо только с помощью 'itertools'. –

ответ

2

Учитывая, что вы говорите об использовании itertools.izip(), я собираюсь предположить, что вы используете Python 2 здесь.

Использование itertools.islice() для облегчения пропуска строки из файлов, а itertools.izip_longest() function лениво совмещать чтение параллельно, а также работать с файлами, которые короче:

from itertools import islice, izip_longest 

filenames = [fname1, fname2, fname3] 
open_files = [open(fname) for fname in filenames] 
kth_slice_files = (islice(f, None, None, k) for f in open_files) 
try: 
    for kth_lines in izip_longest(*kth_slice_files, fillvalue=''): 
     # do something with those combined lines 

islice(fileobj, None, None, k) начнется в линии первый, затем пропустить k - 1 строк, чтобы дать вам 1 + k, затем 1 + 2 * k и т. Д. Строки. Если вам нужно начать с более поздней строки, замените первое None на это начальное значение.