¿Por qué no puedo llamar a read() dos veces en un archivo abierto?
Para un ejercicio que estoy haciendo, intento leer el contenido de un archivo determinado dos veces usando el read()
método. Curiosamente, cuando lo llamo por segunda vez, ¿no parece devolver el contenido del archivo como una cadena?
Aquí está el código
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
Por supuesto, sé que esta no es la mejor ni la más eficiente, este no es el punto aquí. La cuestión es, ¿por qué no puedo llamar read()
dos veces? ¿Tengo que restablecer el identificador del archivo? ¿O cerrar/volver a abrir el archivo para poder hacerlo?
La llamada read()
lee todo el archivo y deja el cursor de lectura al final del archivo (sin nada más que leer). readline()
Si está buscando leer una cierta cantidad de líneas a la vez , puede usar readlines()
o iterar a través de líneas con for line in handle:
.
Para responder a su pregunta directamente, una vez que se haya leído un archivo, read()
puede usar seek(0)
para devolver el cursor de lectura al inicio del archivo (los documentos están aquí ). Si sabe que el archivo no será demasiado grande, también puede guardar el read()
resultado en una variable y usarlo en sus findall
expresiones.
PD. No olvide cerrar el archivo una vez que haya terminado.
Como sugirieron otras respuestas, deberías utilizar seek()
.
Sólo escribiré un ejemplo:
>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output