Нет, вы не можете. В Python все данные (классы, методы, функции и т. Д.), Определенные в модулях расширения C (включая встроенные), неизменяемы. Это связано с тем, что C-модули совместно используются несколькими интерпретаторами в одном и том же процессе, поэтому monkeypatching them также влияет на несвязанных интерпретаторов в одном и том же процессе.
Однако классы, определенные в коде Python, могут быть обезврежены, поскольку они локальны для этот интерпретатор.
Вызов read()
читает весь файл и оставляет курсор чтения в конце файла (ничего больше не читать). Если вы хотите прочитать определенное количество строк за раз, вы можете использовать readline()
, readlines()
или перебирать строки с помощью for line in handle:
.
Чтобы ответить на ваш вопрос напрямую, был прочитан, с read()
вы можете использовать seek(0)
, чтобы вернуть курсор чтения к началу файла (docs здесь ). Если вы знаете, что файл не будет слишком большим, вы также можете сохранить вывод read()
в переменной, используя его в выражениях поиска.
Ps. Не забудьте закрыть файл после его завершения;)
да, как указано выше ...
Я напишу только пример:
>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output
Каждый открытый файл имеет связанную позицию. Когда вы читаете (), вы читаете с этой позиции. Например, read(10)
считывает первые 10 байт из вновь открытого файла, затем другой read(10)
считывает следующие 10 байтов. read()
без аргументов считывает все содержимое файла, оставляя позицию файла в конце файла. В следующий раз, когда вы вызываете read()
, читать нечего.
Вы можете использовать seek
для перемещения позиции файла. Или, вероятно, лучше в вашем случае было бы сделать один read()
и сохранить результат для обоих поисков.
Каждый, кто ответил на этот вопрос до сих пор, абсолютно прав - read()
перемещается по файлу, поэтому после того, как вы его вызвали, вы не можете его снова называть.
Что я буду add - это то, что в вашем конкретном случае вам не нужно искать назад или снова открывать файл, вы можете просто сохранить текст, который вы прочитали в локальной переменной, и использовать его дважды или столько раз, сколько вам нравится, в вашей программе:
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
Указатель чтения перемещается после последнего прочитанного байта / символа. Используйте метод seek()
для перемотки указателя чтения к началу.
read()
потребляет. Таким образом, вы можете сбросить файл или искать до начала перед повторным чтением. Или, если он выполняет вашу задачу, вы можете использовать read(n)
для использования только n
байтов.
Я всегда нахожу метод чтения что-то вроде прогулки по темному переулку. Вы опускаетесь немного и останавливаетесь, но если вы не считаете свои шаги, вы не знаете, насколько далеко вы находитесь. Seek дает решение путем повторного позиционирования, другой вариант - Tell, который возвращает позицию вдоль файла. Может быть, файл Python api может объединить чтение и поиск в read_from (position, bytes), чтобы упростить его - до этого вы должны прочитать эту страницу .