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

Почему я не могу дважды вызвать read() в открытом файле?

В упражнении, которое я делаю, я пытаюсь дважды прочитать содержимое данного файла с помощью метода read(). Как ни странно, когда я его вызываю во второй раз, он, похоже, не возвращает содержимое файла в виде строки?

Здесь код

f = f.open()

# get the year
match = re.search(r'Popularity in (\d+)', f.read())

if match:
  print match.group(1)

# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())

if matches:
  # matches is always None

Конечно, я знаю, что это не самый эффективный или лучший способ, здесь дело не в этом. Дело в том, почему я не могу дважды называть read()? У меня есть reset дескриптор файла? Или закройте/откройте файл, чтобы сделать это?

4b9b3361

Ответ 1

Вызов read() читает весь файл и оставляет курсор чтения в конце файла (ничего больше не читать). Если вы хотите прочитать определенное количество строк за раз, вы можете использовать readline(), readlines() или перебирать строки с помощью for line in handle:.

Чтобы ответить на ваш вопрос напрямую, как только файл был прочитан, с помощью read() вы можете использовать seek(0), чтобы вернуть курсор чтения к началу файла (документы здесь). Если вы знаете, что файл не будет слишком большим, вы также можете сохранить вывод read() в переменную, используя ее в выражениях для поиска.

Ps. Не забудьте закрыть файл после того, как вы закончите с ним;)

Ответ 2

да, как указано выше...

Я напишу только пример:

>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output

Ответ 3

Каждый, кто ответил на этот вопрос до сих пор, абсолютно прав - read() перемещается по файлу, поэтому после того, как вы его вызвали, вы не можете его снова вызвать.

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

f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
  print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
  # matches will now not always be None

Ответ 4

Указатель чтения перемещается после последнего прочитанного байта/символа. Используйте метод seek(), чтобы перемотать указатель чтения в начало.

Ответ 5

Каждый открытый файл имеет связанную позицию.
Когда вы читаете(), вы читаете с этой позиции. Например, read(10) считывает первые 10 байт из вновь открытого файла, затем другой read(10) считывает следующие 10 байтов. read() без аргументов читает все содержимое файла, оставляя позицию файла в конце файла. В следующий раз, когда вы вызываете read(), читать нечего.

Вы можете использовать seek для перемещения позиции файла. Или, вероятно, лучше в вашем случае было бы сделать один read() и сохранить результат для обоих поисков.

Ответ 6

read() потребляет. Таким образом, вы могли бы reset файл или начать поиск перед повторным чтением. Или, если он соответствует вашей задаче, вы можете использовать read(n) для использования только n байтов.

Ответ 7

Я всегда нахожу метод чтения что-то вроде прогулки по темному переулку. Вы опускаетесь немного и останавливаетесь, но если вы не считаете свои шаги, вы не знаете, насколько далеко вы находитесь. Seek дает решение путем повторного позиционирования, другой вариант - Tell, который возвращает позицию вдоль файла. Может быть, файл Python api может комбинировать чтение и поиск в read_from (position, bytes), чтобы сделать его более простым - пока это не произойдет, вы должны прочитать this page.