Hace readlines () devuelven una lista o un iterador en Python 3?
-
30-09-2019 - |
Pregunta
He leído en "Inmersión en Python 3" que "Los readlines () método devuelve ahora un iterador, por lo que es igual de eficiente que xreadlines () fue en Python 2". Ver aquí: http://diveintopython3.org/porting-code- a-python-3-con-2to3.html . No estoy seguro de que es verdad porque no lo mencionan aquí: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . ¿Cómo puedo comprobar que?
Solución
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.
>>>
Otros consejos
El método readlines no devuelve un iterador en Python 3, devuelve una lista ??p>
Help on built-in function readlines:
readlines(...)
Return a list of lines from the stream.
Para comprobar, simplemente llamarlo desde una sesión interactiva - se devolverá una lista, en lugar de un iterador:
>>> type(f.readlines())
<class 'list'>
Inmersión en Python parece estar mal en este caso.
xreadlines ha sido href="http://www.python.org/download/releases/2.3/highlights/" rel="noreferrer"> en desuso desde Python 2.3 cuando los objetos de archivos se convirtió en su propia iteradores. La manera de conseguir la misma eficacia que es xreadlines
en lugar de utilizar
for line in f.xreadlines():
for line in f:
Esto se consigue el iterador que desea, y ayuda a explicar por qué readlines
no tenía necesidad de cambiar su comportamiento en Python 3 - todavía puede devolver una lista completa, con el lenguaje line in f
dando el enfoque iterativo, y la larga xreadlines
-deprecated se ha eliminado por completo.
Otros han dicho tanto ya, pero sólo para remachar el clavo, objetos de archivo comunes son sus propios iteradores. Así que tener retorno readlines()
un iterador sería tonto, ya que acaba de devolver el archivo que llama a encenderlo. Se puede utilizar un bucle for
para repetir un archivo, como Scott dijo, y también se los puede transferir directamente a las funciones 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)