Readlines () renvoie-t-il une liste ou un itérateur en Python 3?

J'ai lu dans "Dive into Python 3" que "la méthode readlines () renvoie maintenant un itérateur, donc elle est aussi efficace que xreadlines () était en Python 2". Voir ici: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html . Je ne suis pas sûr que ce soit vrai parce qu'ils ne le mentionnent pas ici: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . Comment puis-je vérifier?

25
demandé sur snakile 2010-08-22 14:55:49

3 réponses

Comme ceci:

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.

>>>
20
répondu John Machin 2010-08-22 11:03:56

La méthode readlines ne renvoie pas d'itérateur en Python 3, elle renvoie une liste

Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

Pour vérifier, appelez-le simplement à partir d'une session interactive - il retournera une liste, plutôt qu'un itérateur:

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

Plonger dans Python semble être faux dans ce cas.


xreadlines a été obsolète depuis Python 2.3 lorsque les objets de fichier sont devenus leurs propres itérateurs. La façon d'obtenir la même efficacité que xreadlines est au lieu d'utiliser

 for line in f.xreadlines():

Tu devrais utilisez simplement

 for line in f:

Cela vous donne l'itérateur que vous voulez, et aide à expliquer pourquoi readlines n'a pas besoin de changer son comportement en Python 3 - Il peut toujours renvoyer une liste complète, avec l'idiome line in f donnant l'approche itérative, et le xreadlines long-obsolète a été complètement supprimé.

25
répondu Scott Griffiths 2010-08-22 15:01:29

D'autres l'ont déjà dit, mais juste pour ramener le point à la maison, les objets de fichiers ordinaires sont leurs propres itérateurs. Donc, avoir readlines() retourner un itérateur serait stupide, car il retournerait simplement le fichier sur lequel vous l'avez appelé. Vous pouvez utiliser une boucle for pour itérer sur un fichier, comme L'a dit Scott, et vous pouvez également les passer directement aux fonctions 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)
7
répondu Jack O'Connor 2012-10-27 19:53:21