2010-08-22 48 views

Respuesta

17

De esta manera:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('/junk/so/foo.txt') 
>>> type(f.readlines()) 
<class 'list'> 
>>> help(f.readlines) 
Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

    hint can be specified to control the number of lines read: no more 
    lines will be read if the total size (in bytes/characters) of all 
    lines so far exceeds hint. 

>>> 
24

El método readlines no devuelve un iterador en Python 3, devuelve una lista

Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

Para comprobarlo, simplemente llamarlo desde una sesión interactiva - se devolverá una lista, en lugar de un iterador:

>>> type(f.readlines()) 
<class 'list'> 

La inmersión en Python parece ser incorrecta en este caso.


xreadlines ha sido deprecated since Python 2.3 cuando los objetos se convirtieron en sus propios archivos iteradores. La manera de conseguir la misma eficacia que es xreadlines en lugar de utilizar

for line in f.xreadlines(): 

you should use simply

for line in f: 

Esto se consigue el iterador que desea, y ayuda a explicar por qué readlines no necesitaban cambiar su comportamiento en Python 3 - todavía puede devolver una lista completa, con la expresión line in f dando el enfoque iterativo, y la largamente obsoleta xreadlines ha sido eliminada por completo.

+0

yo esperaría que cualquier persona que estaba usando 'para la línea de f.xreadlines() : 'lo habrá convertido a' para la línea en f: 'hace años. –

+0

@John Machin: Espero que también (aunque quizás no lo espere). No quise dar a entender que 'xreadlines' era la forma preferida de hacerlo en Python 2; ya estaba desaprobado en Python 2.3 cuando el método file-as-iterator fue introducido. Solo quise dar la razón por la que podría eliminarse en Python 3. –

+2

Solo descubrí que los archivos eran sus propios iteradores hace aproximadamente una semana :(Creo que eso me sirve para no mirar las notas del tutorial/release desde 1.5. – wbg

7

Otros han dicho lo mismo ya, pero sólo para remachar el clavo, objetos de archivo comunes son sus propios iteradores. Así que tener readlines() devolver un iterador sería una tontería, porque simplemente devolvería el archivo que lo invocó. Se puede utilizar un bucle for para repetir un archivo, como Scott dijo, y también se puede pasarlas directamente a itertools funciones:

from itertools import islice 
f = open('myfile.txt') 
oddlines = islice(f, 0, None, 2) 
firstfiveodd = islice(oddlines, 5) 
for line in firstfiveodd: 
    print(line) 
Cuestiones relacionadas