Объект, возвращаемый open
, действует как собственный итератор. Когда вы перебираете его содержимое, указатель файла остается в конце файла. Это означает, что второй for
l oop начинается в конце, а не получает итератор fre sh, который начинается с начала.
Чтобы повторить итерацию снова, используйте метод seek
для возврата к началу файла.
>>> fh = open("romeo.txt")
>>> for line in fh:
... print(line.rstrip())
...
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
<b>>>> fh.seek(0)
0</b>
>>> for line in fh:
... print(line.rstrip())
...
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
Обратите внимание на разницу между объектом TextIOWrapper
, возвращаемым open
:
>>> type(fh)
<class '_io.TextIOWrapper'>
>>> type(iter(fh))
<class '_io.TextIOWrapper'>
>>> fh is iter(fh)
True
и список, который является не собственным итератором.
>>> x = [1,2,3]
>>> type(x)
<class 'list'>
>>> type(iter(x))
<class 'list_iterator'>
>>> x is iter(x)
False
Каждый вызов iter(x)
возвращает другой итератор для того же списка x
.