В своем упражнении я пытаюсь дважды прочитать содержимое данного файла с помощью этого 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()
дважды? Мне нужно сбросить дескриптор файла? Или закрыть / снова открыть файл для этого?
Ответы:
Вызов
read()
выполняет чтение всего файла и оставляет курсор чтения в конце файла (читать больше нечего). Если вы хотите прочитать определенное количество строк , в то время , вы могли бы использоватьreadline()
,readlines()
или итерацию по линиям сfor line in handle:
.Чтобы ответить на ваш вопрос напрямую, как только файл был прочитан,
read()
вы можете использовать егоseek(0)
для возврата курсора чтения в начало файла (документы здесь ). Если вы знаете, что файл не будет слишком большим, вы также можете сохранитьread()
вывод в переменной, используя его в своих выражениях findall.Пс. Не забудьте закрыть файл после того, как закончите с ним;)
источник
with
.да, как указано выше ...
напишу только пример:
источник
Все, кто ответил на этот вопрос, абсолютно прав -
read()
перемещаются по файлу, поэтому после того, как вы его вызвали, вы не можете вызвать его снова.Я добавлю, что в вашем конкретном случае вам не нужно возвращаться к началу или повторно открывать файл, вы можете просто сохранить текст, который вы прочитали в локальной переменной, и использовать его дважды, или сколько угодно раз в своей программе:
источник
from pathlib import Path; text = Path(filename).read_text()
Указатель чтения перемещается после последнего прочитанного байта / символа. Используйте
seek()
метод, чтобы перемотать указатель чтения в начало.источник
У каждого открытого файла есть связанная позиция.
Когда вы читаете (), вы читаете с этой позиции. Например,
read(10)
читает первые 10 байтов из вновь открытого файла, затем другойread(10)
читает следующие 10 байтов.read()
без аргументов читает все содержимое файла, оставляя позицию файла в конце файла. В следующий раз, когда вы позвоните,read()
читать нечего.Вы можете использовать
seek
для перемещения позиции файла. Или, возможно, в вашем случае лучше было бы сделать одинread()
и сохранить результат для обоих поисков.источник
read()
потребляет . Таким образом, вы можете сбросить файл, или обратиться к старту до повторного чтения. Или, если это соответствует вашей задаче, вы можете использоватьread(n)
толькоn
байты.источник
Я всегда нахожу метод чтения чем-то вроде прогулки по темному переулку. Вы немного спускаетесь и останавливаетесь, но если вы не считаете свои шаги, вы не знаете, как далеко вы продвинулись. Seek дает решение путем изменения положения, другой вариант - Tell, который возвращает позицию вдоль файла. Возможно, api файла Python может объединять чтение и поиск в read_from (позиция, байты), чтобы упростить задачу - пока это не произойдет, вы должны прочитать эту страницу .
источник