He leído en "Inmersión en Python 3" que "El método readlines() ahora devuelve un iterador, por lo que es tan eficiente como xreadlines() en Python 2". Vea 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 verificar eso?¿readlines() devuelve una lista o un iterador en Python 3?
Respuesta
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.
>>>
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():
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.
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)
- 1. Tratamiento de errores Unicode con readlines de Python 3()
- 2. ¿Cómo se devuelve un iterador en Scala?
- 3. Recorrer una lista con un iterador?
- 4. Lista vs Lista iterador
- 5. ¿Cómo sobrescribir el comportamiento de la lista de Python (iterador)?
- 6. Cómo convertir un generador o un iterador a una lista recursiva
- 7. ¿Por qué este "[:: - 1]" devuelve una lista invertida en Python?
- 8. Arroyo de readlines
- 9. División de una cadena en un iterador
- 10. python 3: class "template" (función que devuelve una clase parametrizada)
- 11. ¿Qué sustituye xreadlines() en Python 3?
- 12. python - tamaño del iterador invocable?
- 13. iterador perezosa de Python
- 14. ¿Omitir iterador en la lista de comprensión?
- 15. Imprimir una lista de números en Python v.3
- 16. Nuevo proyecto: Python 2 o Python 3?
- 17. Tipo (3,) devuelve un número entero en lugar de una tupla en Python, ¿por qué?
- 18. Eliminar un elemento de una lista con solo su iterador
- 19. Obtener un mapa() para devolver una lista en Python 3.x
- 20. Python 2.7 o Python 3 (por velocidad)?
- 21. Segmente una lista en Python
- 22. ¿Puede un método Ruby rendir como un iterador o devolver una matriz según el contexto?
- 23. Lista de 3 dimensiones o Mapa
- 24. Crear un iterador básico de Python
- 25. Python 3 rango de vueltas a una lista
- 26. ¿Se devuelve un operador o una función?
- 27. ¿Hay una lista de bibliotecas de Python 3 de terceros?
- 28. ¿Hay una manera fácil de copiar un iterador en una lista en Java?
- 29. iterador de lista no aumentable
- 30. ¿Devuelve una lista de los módulos de Python importados utilizados en un script?
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. –
@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. –
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