Question

Je l'ai lu « Plongez dans Python 3 » que « La méthode readlines () retourne maintenant un itérateur, il est tout aussi efficace que xreadlines () était en Python 2 ». Voir ici: http://diveintopython3.org/porting-code- à python-3-with-2to3.html . Je ne suis pas sûr que c'est vrai parce qu'ils ne mentionnent pas ici: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . Comment puis-je vérifier cela?

Était-ce utile?

La solution

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.

>>>

Autres conseils

La méthode readlines ne retourne pas un itérateur en 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 d'appeler à partir d'une session interactive - il retournera une liste, au lieu d'un iterator:

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

Plongez au coeur de Python semble erroné dans ce cas.


xreadlines a été href="http://www.python.org/download/releases/2.3/highlights/" rel="noreferrer"> depuis Python 2.3 Obsolète lorsque des objets de fichiers est devenu leur propre 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 obtient le iterator que vous voulez, et aide à expliquer pourquoi readlines n'a pas besoin de changer son comportement en Python 3 - il peut revenir encore une liste complète, avec l'idiome line in f donnant l'approche itérative et long -deprecated xreadlines a été complètement supprimé.

D'autres ont dit que déjà beaucoup, mais juste pour conduire la maison point, les objets de fichiers ordinaires sont leurs propres itérateurs. Donc, avoir le retour de readlines() un itérateur serait stupide, parce que ce serait tout simplement retourner le dossier que vous avez appelé sur. Vous pouvez utiliser une boucle de for itérer sur un fichier, comme Scott a dit, et vous pouvez également les passer directement aux fonctions de 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top