Зависимость .readline от типа цикла

Почему в зависимости от типа цикла метод .readline выдает разные результаты? В первом случае запускаю цикл:

testfile = open('Тест.txt','r')
for i in testfile:
    i = testfile.readline()
    print(i, end="")
testfile.close()

Получаю результат: 2w 4w 6w 8w

Во втором цикле:

testfile = open('Тест.txt','r')
i = testfile.readline()
while i:
    i = testfile.readline()
    print(i, end="")
testfile.close()

получаю результат:

2w 3q 4w 5q 6w 7q 8w 9q

При этом проигнорирована первая строка - 1q

Файл Тест.txt:

1q 2w 3q 4w 5q 6w 7q 8w 9q


Ответы (1 шт):

Автор решения: dynamic.aerospace.inc

При использовании цикла for:

testfile = open('Тест.txt', 'r')
for stroka in testfile:
    stroka = testfile.readline()
    print(stroka, end="")
testfile.close()

Что происходит: В этом цикле вы итерируете по объекту файла testfile. Каждый раз, когда происходит итерация, Python автоматически вызывает testfile.readline(), чтобы получить следующую строку. Однако внутри цикла вы снова вызываете testfile.readline(), что приводит к тому, что вы пропускаете каждую вторую строку файла. Таким образом, вы получаете только строки с четными номерами (2w, 4w, 6w, 8w)

При использовании цикла while:

testfile = open('Тест.txt', 'r')
stroka = testfile.readline()
while stroka:
    stroka = testfile.readline()
    print(stroka, end="")
testfile.close()

Что происходит: В этом цикле вы сначала считываете первую строку файла с помощью stroka = testfile.readline(). Затем, в условии цикла while, вы снова считываете строку перед тем, как ее напечатать. В результате вы печатаете строки, начиная со второй (3q, 4w, 5q и так далее). Таким образом, вы пропускаете первую строку и печатаете все последующие.

Решение проблемы:

С циклом for:

 testfile = open('Тест.txt', 'r')
    for stroka in testfile:
        print(stroka, end="")
    testfile.close()

С циклом while:

testfile = open('Тест.txt', 'r')
stroka = testfile.readline()
while stroka:
    print(stroka, end="")
    stroka = testfile.readline()
testfile.close()
→ Ссылка