Цикл в цикле для файлов

257 просмотра
0
0 Комментариев

Делаю так:

f = open(sys.argv[1] )
ff = open(sys.argv[2] )
 
for line    in  f:
    for line2   in  ff:
        print line,line2

но выводит только первую строку из файла f, хотя если отдельно его вывести, то выводит все строки.

Например в файле f есть строки:

12
 
123

а в файле ff строка 1234,нужно чтоб вывело так :

12 1234
 
123 1234

в моем же случае выводит :

12 1234

не берет в расчет вторую и последующие строки.


Добавить комментарий

2 Answers

Python Опубликовано 18.12.2018
0

Функция open возвращает итератор по файлу, который возвращает поочерёдно по одной строке с первой по последнюю. После того, как итератор дошёл до конца файла, он полностью исчерпан и повторно его использовать нельзя.

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

Выход — создавать итератор уже внутри цикла, чтобы он каждый раз обновлялся.

f = open(sys.argv[1] )
 
for line    in  f:
    ff = open(sys.argv[2] )
    for line2   in  ff:
        print line,line2

Добавить комментарий
0

Здесь не нужен цикл. Как ответили ранее — здесь используются итераторы. Работайте с файлом, как с итерируемым объектом

with open("textfile1") as textfile1, open("textfile2") as textfile2:
    for x, y in zip(textfile1, textfile2):
        x = x.strip()
        y = y.strip()
        print("{0}\t{1}".format(x, y))

После вызова содержимого итератора — он становится недоступным. Сохраняйте его значение в переменную для того чтобы передавать во вложенный цикл, или используйте для передачи lambda-функцию, если его состояние сохранять не требуется.

Подробнее о работе с итераторами можно почитать из книги М. Лутца «Изучаем Python»

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up