Para un ejercicio que estoy haciendo, estoy tratando de leer el contenido de un archivo dado dos veces usando el read()
método. Curiosamente, cuando lo llamo por segunda vez, ¿no parece devolver el contenido del archivo como una cadena?
Aqui esta el codigo
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 o más eficiente manera, este no es el punto aquí. El punto es, ¿por qué no puedo llamar read()
dos veces? ¿Tengo que restablecer el identificador del archivo? ¿O cerrar / volver a abrir el archivo para hacer eso?
Respuestas:
La llamada
read()
lee todo el archivo y deja el cursor de lectura al final del archivo (sin nada más para leer). Si usted está buscando para leer un cierto número de líneas a la vez se puede usarreadline()
,readlines()
o se puede recorrer con líneasfor line in handle:
.Para responder a su pregunta directamente, una vez que se ha leído un archivo, con
read()
puede usarseek(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 laread()
salida en una variable, usándola en sus expresiones findall.PD. No olvide cerrar el archivo una vez que haya terminado con él;)
fuente
with
.sí, como arriba ...
escribiré solo un ejemplo:
fuente
Todos los que han respondido a esta pregunta hasta ahora tienen toda la razón:
read()
recorren el archivo, por lo que después de llamarlo, no puede volver a llamarlo.Lo que agregaré es que, en su caso particular, no es necesario volver al inicio o volver a abrir el archivo, simplemente puede almacenar el texto que ha leído en una variable local y usarlo dos veces, o tantas veces como quieras, en tu programa:
fuente
from pathlib import Path; text = Path(filename).read_text()
Se encarga de abrir, cerrar, etc.El puntero de lectura se mueve después del último byte / carácter leído. Utilice el
seek()
método para rebobinar el puntero de lectura hasta el principio.fuente
Cada archivo abierto tiene una posición asociada.
Cuando lee () lee desde esa posición. Por ejemplo,
read(10)
lee los primeros 10 bytes de un archivo recién abierto, luego otroread(10)
lee los siguientes 10 bytes.read()
sin argumentos lee todo el contenido del archivo, dejando la posición del archivo al final del archivo. La próxima vez que llameread()
no hay nada que leer.Puede utilizar
seek
para mover la posición del archivo. O probablemente lo mejor en su caso sería hacer unaread()
y mantener el resultado de ambas búsquedas.fuente
read()
consume . Por lo tanto, puede restablecer el archivo o buscar el inicio antes de volver a leer. O, si se adapta a su tarea, puede usarread(n)
para consumir solon
bytes.fuente
Siempre encuentro el método de lectura como un paseo por un callejón oscuro. Bajas un poco y te detienes pero si no estás contando tus pasos no estás seguro de qué tan lejos estás. Seek da la solución reposicionando, la otra opción es Tell, que devuelve la posición a lo largo del archivo. Puede ser que la api del archivo Python pueda combinar lectura y búsqueda en un read_from (posición, bytes) para hacerlo más simple; hasta que eso suceda, debe leer esta página .
fuente