Вопрос-Ответ

Why can't I call read() twice on an open file?

Почему я не могу дважды вызвать 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() дважды? Нужно ли мне сбрасывать дескриптор файла? Или закрыть / повторно открыть файл, чтобы сделать это?

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

Как предлагалось в других ответах, вам следует использовать seek().

Я просто напишу пример:

>>> 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(), чтобы перемотать указатель чтения на начало.

python