2014-01-10 3 views
1

Я пытаюсь запустить две петли itertools, но я получаю сообщение об ошибке. Это мой код:Использование двух циклов itertools

import itertools 
with open('lognew.txt', 'r') as f: 
    firstlines = itertools.islice(f, 0, None, 1) 
    secondlines = itertools.islice(f, 0, None, 2) 

    for (line1 in firstlines) and (line2 in secondlines): 
     print line1 + line2 

Я получаю эту ошибку:

File "C:\Users\abhi\Desktop\logedit.py", line 15 
    for (line1 in firstlines) and (line2 in secondlines): 
          ^
SyntaxError: invalid syntax 

Я хочу, чтобы результат как это:

<first line in firstlines> is meaning of <first line in secondlines> 
<second line in firstlines> is meaning of <second line in secondlines> 
<third line in firstlines> is meaning of <third line in secondlines> 

Там нет ошибки в чтении файлов в виде следующего кода успешно печатает строки.

for line1 in firstlines : 
    print line1 
for line2 in secondlines : 
    print line2 

Любая помощь очень ценится.

ответ

3

Ваши ломтики не будут делать то, что вы думаете они будут делать. Первый фрагмент дает вам только первую строку, второй фрагмент дает вам следующую строку , если вы пропустите ее после первого фрагмента. Это потому, что входной файл уже продвинул одну строку, поэтому второй объект среза пропустит один, даст вам следующий, на итерации. У вас будет строка 1, затем строка 3, затем строка 4, затем строка 6 и т. Д., Если у вас были файлы в формате zip.

Что вы действительно хотите, это петлевая линия. Для этого вам не нужно использовать нарезку вообще; использовать itertools.izip(); это даст вам каждые две строки заархивированы вместе:

from itertools import izip 

with open('lognew.txt', 'r') as f: 
    for line1, line2 in izip(f, f): 
     print line1.rstrip('\n') + line2 

Каждая итерация, izip() получит значение из первого аргумента (открытый объект файла f), то из второго аргумента (также открыт объект файла f). Поскольку файл-объект переходит к следующей строке каждый раз, когда он повторяется, вышесказанное эффективно дает вам строки из файла парами.

Обратите внимание, что если файл имеет нечетное количество строк, вы не увидите последнюю строку. Если вам нужен доступ к этой последней строке, используйте itertools.izip_longest() вместо:

from itertools import izip_longest 

with open('lognew.txt', 'r') as f: 
    for line1, line2 in izip_longest(f, f, fillvalue='\n'): 
     print line1.rstrip('\n') + line2 

который добавит пустую строку (fillvalue='\n'), если число строк нечетно.

В Python 3, itertools.izip() заменил встроенный zip() функции и itertools.izip_longest() был переименован в itertools.zip_longest().

+0

Здесь вы можете узнать что-то новое здесь, в stackoverflow. Замечательный ответ, слишком плохо, что вы можете дать только +1 ... –

+0

Отлично! Не только ответ, но и объяснение! Я попытался использовать для line1, line2, line3 в izip (f, f, f), и теперь я могу заархивировать 3 строки. Благодарю. –

Смежные вопросы