¿Por qué no puedo llamar a read() dos veces en un archivo abierto?

Resuelto helpermethod asked hace 13 años • 7 respuestas

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?

helpermethod avatar Oct 11 '10 19:10 helpermethod
Aceptado

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 findallexpresiones.

PD. No olvide cerrar el archivo una vez que haya terminado.

Tim avatar Oct 11 '2010 12:10 Tim

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
Ant avatar Oct 11 '2010 13:10 Ant