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?

¿Fue útil?

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

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

se debe utilizar simplemente

 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top