Подтвердить что ты не робот

Повторение файла не работает второй раз

У меня проблема с повторением файла. Вот что я печатаю на интерпретаторе и результат:

>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
...  print(line)
... 
# ... all the lines from the file appear here ...

Когда я снова пытаюсь повторить этот же открытый файл, я ничего не получаю!

>>> for line in f.readlines():
...  print(line)
... 
>>>

Нет вывода вообще. Чтобы решить эту проблему, я должен close() файл, а затем снова открыть его для чтения! Это нормальное поведение?

4b9b3361

Ответ 1

Да, это нормальное поведение. Вы в основном читаете в конце файла в первый раз (вы можете сортировать его как чтение ленты), поэтому вы не можете читать дальше, если только вы не reset, либо используя f.seek(0) для перестановки в начало файла или закрыть его, а затем снова открыть его, который начнется с начала файла.

Если вы предпочитаете использовать вместо этого синтаксис with, который автоматически закроет файл для вас.

например.

with open('baby1990.html', 'rU') as f:
  for line in f:
     print line

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

Ответ 2

Когда файл файл считывает файл, он использует указатель, чтобы отслеживать, где он находится. Если вы прочитаете часть файла, а затем вернитесь к нему позже, он поднимется туда, где вы остановились. Если вы прочитаете весь файл и вернетесь к тому же файловому объекту, это будет похоже на чтение пустого файла, потому что указатель находится в конце файла, и читать его нечего. Вы можете использовать file.tell(), чтобы увидеть, где в файле указатель, и file.seek, чтобы установить указатель. Например:

>>> file = open('myfile.txt')
>>> file.tell()
0
>>> file.readline()
'one\n'
>>> file.tell()
4L
>>> file.readline()
'2\n'
>>> file.tell()
6L
>>> file.seek(4)
>>> file.readline()
'2\n'

Кроме того, вы должны знать, что file.readlines() читает весь файл и сохраняет его как список. Это полезно знать, потому что вы можете заменить:

for line in file.readlines():
    #do stuff
file.seek(0)
for line in file.readlines():
    #do more stuff

с:

lines = file.readlines()
for each_line in lines:
    #do stuff
for each_line in lines:
    #do more stuff

Вы также можете перебирать файл по одной строке за раз, не сохраняя весь файл в памяти (это может быть очень полезно для очень больших файлов):

for line in file:
    #do stuff

Ответ 3

Файловый объект является буфером. Когда вы читаете из буфера, та часть, которую вы читаете, расходуется (позиция чтения смещается вперед). Когда вы читаете весь файл, позиция чтения находится в конце файла (EOF), поэтому он ничего не возвращает, потому что больше нечего читать.

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

f.seek(0)

Ответ 4

Конечно. Это нормальное и нормальное поведение. Вместо закрытия и повторного открытия вы можете rewind сохранить файл.