Python Open () и дескрипторы файлов? - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в Python, и я прочитал файл в память. Затем я делаю простой l oop, чтобы увидеть, что такое содержимое файла ....

Затем я пытаюсь выполнить другое действие с файлом, и оказывается, что он исчез или покинул память?

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

>>> fh = open('C:/Python/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
>>> for line in fh:
...     print(line)

1 Ответ

1 голос
/ 09 мая 2020

Объект, возвращаемый 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.

...