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():
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)