2012-04-21 14 views
38

tengo un problema de entender la iteración en un archivo, aquí voy de lo que yo escriba en el intérprete y el resultado:iteración en un archivo usando Python

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 

>>> ... 
>>> ... all the lines from the file appear here 
>>> ... 

Cuando trato de repetir en el mismo abierto archivo de nuevo, no tengo nada !!!!

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 
>>> 
>>> 

No hay salida en absoluto, para solucionar esto tengo que cerrar() el archivo y luego abrirlo de nuevo para leerlo !! ¿Es eso un comportamiento normal?

Respuesta

61

Sí, eso es un comportamiento normal. Básicamente, lee hasta el final del archivo la primera vez (puede imaginarlo como si leyera una cinta), por lo que no puede leer más a menos que lo reinicie, ya sea usando f.seek(0) para reposicionarlo hasta el inicio de el archivo, o para cerrarlo y luego abrirlo de nuevo, que comenzará desde el comienzo del archivo.

Si lo prefiere, puede utilizar la sintaxis with que cerrará automáticamente el archivo por usted.

por ejemplo,

with open('baby1990.html', 'rU') as f: 
    for line in f: 
    print line 

Superado este bloque se haya ejecutado, el archivo se cierra automáticamente para usted, por lo que podría ejecutar este bloque varias veces sin cerrar explícitamente el archivo usted mismo y leer el archivo de esta manera otra vez.

+0

PO quiere ayudar a la comprensión de lo que está sucediendo cuando un objeto de archivo es consumido –

+0

Acabo de agregar esa parte de la explicación – Levon

+1

No hay ninguna razón para leer el archivo dos veces si está utilizando 'readlines()'. –

1

Por supuesto. Eso es un comportamiento normal y sano. En lugar de cerrar y volver a abrir, puede rewind el archivo.

+0

Esto no es útil para un usuario que no esté familiarizado con el concepto de una lectura puntero – scubbo

8

El objeto de archivo es buffer. Cuando lee desde el búfer, la porción que lee se consume (la posición de lectura se desplaza hacia adelante). Cuando lee todo el archivo, la posición de lectura está en el EOF, por lo que no devuelve nada porque no queda nada por leer.

Si usted tiene que, por alguna razón, restablecer la posición de lectura en un objeto de archivo, que puede hacer:

f.seek(0) 
13

A medida que el objeto de archivo lee el archivo, se utiliza un puntero para realizar un seguimiento de dónde es. Si lees parte del archivo, luego vuelve y luego continuará donde lo dejaste. Si lee el archivo completo y vuelve al mismo objeto de archivo, será como leer un archivo vacío porque el puntero se encuentra al final del archivo y no queda nada por leer. Puede usar file.tell() para ver dónde está el puntero en el archivo y file.seek para establecer el puntero. Por ejemplo:

>>> file = open('myfile.txt') 
>>> file.tell() 
0 
>>> file.readline() 
'one\n' 
>>> file.tell() 
4L 
>>> file.readline() 
'2\n' 
>>> file.tell() 
6L 
>>> file.seek(4) 
>>> file.readline() 
'2\n' 

Además, usted debe saber que file.readlines() lee todo el archivo y lo almacena en una lista.Eso es útil saber porque se puede reemplazar:

for line in file.readlines(): 
    #do stuff 
file.seek(0) 
for line in file.readlines(): 
    #do more stuff 

con:

lines = file.readlines() 
for each_line in lines: 
    #do stuff 
for each_line in lines: 
    #do more stuff 

También se pueden recorrer más de un archivo, una línea a la vez, sin tener todo el archivo en la memoria (esto puede ser muy útil para archivos muy grandes) haciendo:

for line in file: 
    #do stuff 
Cuestiones relacionadas