Вложенные циклы для чтения файлов - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в Python, и меня немного смущают некоторые конкретные случаи использования вложенных циклов.

Например, у меня есть два файла ( file1 и file2 ). Файл1 содержит несколько текстовых строк:

line1
line2

и file2 также содержит текст:

line1
line2
line3
line4
line5

и мой сценарий:

with open('file1.txt', 'r') as file1:
    with open('file2.txt', 'r') as file2:
        for line in file1:
            for line2 in file2:
                print(line2),

поэтому я ожидал, что вывод будет таким:

line1
line2
line3
line4
line5
line1
line2
line3 
line4
line5

, но на самом деле мой вывод:

line1
line2
line3
line4
line5

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

1 Ответ

0 голосов
/ 03 октября 2018

почему был выполнен только внутренний цикл?

Это наблюдение неверно.Оба цикла были выполнены.

file объекты являются генераторами.Их можно повторять только один раз, после чего они считаются использованными (т. Е. Пустыми).

На первой итерации внешнего цикла file2 еще не был использован, поэтому внутренний цикл может бытьвыполняется как ожидалось.

Начиная со второй итерации внешнего цикла, file2 полностью используется (т. е. пусто), следовательно, внешнему циклу нечего выполнять, и он по существу эквивалентен:

for line in file1:
    for line2 in []:
        print(line2)

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

Кстати, вы можете иметь несколько операторов with в одной строке, следовательно, сохраняя уровень отступа.Кроме того, 'r' является режимом по умолчанию:

with open('file1.txt') as file1, open('file2.txt') as file2:
    ...
...