web-dev-qa-db-fra.com

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

J'ai lu dans "Plongez dans Python 3" que "La méthode readlines () retourne maintenant un itérateur, donc il est tout aussi efficace que xreadlines () l'était dans 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 que ils ne le mentionnent pas ici: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . Comment puis-je vérifier cela?

32
snakile

Comme ça:

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.

>>>
22
John Machin

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

Help on built-in function readlines:

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

Pour vérifier, il suffit de l'appeler à partir d'une session interactive - il renverra une liste, plutôt qu'un itérateur:

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

Plongez dans Python semble être faux dans ce cas.


xreadlines a été obsolète depuis Python 2. lorsque les objets 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():

vous devez utiliser simplement

 for line in f:

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

31
Scott Griffiths

D'autres l'ont déjà dit, mais juste pour ramener le clou, les objets de fichiers ordinaires sont leurs propres itérateurs. Donc, avoir readlines() renvoyer un itérateur serait idiot, car il retournerait simplement le fichier sur lequel vous l'avez appelé. Vous pouvez utiliser une boucle for pour parcourir un fichier, comme l'a dit Scott, et vous pouvez également les transmettre 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
Jack O'Connor