read example español python iterator python-3.x readlines

example - ¿Readlines() devuelve una lista o un iterador en Python 3?



readline python español (3)

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 llámelo desde una sesión interactiva; devolverá una lista, en lugar de un iterador:

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

Bucear en Python parece estar mal en este caso.

xreadlines ha quedado en desuso desde Python 2.3 cuando los objetos de archivo se convirtieron en sus propios iteradores. La forma de obtener la misma eficiencia que las xreadlines es en lugar de usar

for line in f.xreadlines():

deberías usar simplemente

for line in f:

Esto le da el iterador que desea y le ayuda a explicar por qué las readlines no necesitaban cambiar su comportamiento en Python 3; aún puede devolver una lista completa, con la line in f idioma que proporciona el enfoque iterativo y el largo plazo. xreadlines obsoletos ha sido eliminado completamente.

He leído en "Dive into Python 3" que "el método readlines () ahora devuelve un iterador, por lo que es tan eficiente como xreadlines () en Python 2". Consulte aquí: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html . No estoy seguro de que sea cierto porque no lo mencionan aquí: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . ¿Cómo puedo comprobar eso?


Me gusta esto:

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


Otros ya lo han dicho, pero solo para llevar el punto a casa, los objetos de archivos comunes son sus propios iteradores. Por lo tanto, tener readlines() devolver un iterador sería una tontería, ya que solo devolvería el archivo en el que lo llamaste. Puede usar un bucle for para iterar sobre un archivo, como dijo Scott, y también puede pasarlos directamente a las funciones de itertools:

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