2010-08-22 9 views
23

Ich habe in "Tauchen in Python 3" gelesen, dass "Die readlines() Methode gibt nun einen Iterator zurück, also ist es genauso effizient wie xreadlines() in Python 2" war. Siehe hier: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html. Ich bin mir nicht sicher, ob es wahr ist, weil sie es hier nicht erwähnen: http://docs.python.org/release/3.0.1/whatsnew/3.0.html. Wie kann ich das überprüfen?Liefert readlines() eine Liste oder einen Iterator in Python 3?

Antwort

17

So:

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. 

>>> 
24

Die Methode readlines nicht einen Iterator in Python zurückkehrt 3, es gibt eine Liste

Help on built-in function readlines: 

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

Um zu überprüfen, rufen Sie einfach es aus einer interaktiven Sitzung - es wird eine Liste zurück, anstatt ein Iterator:

Eintauchen in Python scheint in diesem Fall falsch zu sein.


xreadlines hat deprecated since Python 2.3 gewesen, als Dateiobjekte ihre eigenen Iteratoren wurde. Die Art und Weise die gleiche Effizienz wie xreadlines zu bekommen, ist anstelle der Verwendung

for line in f.xreadlines(): 

you should use simply

for line in f: 

Diese bekommt man den Iterator, die Sie wollen, und hilft zu erklären, warum readlines nicht brauchte, um seine zu ändern Verhalten in Python 3 - es kann immer noch eine vollständige Liste zurückgeben, mit der line in f Idiom gibt die iterative Ansatz, und die lange veraltet xreadlines wurde vollständig entfernt.

+0

Ich würde erwarten, dass jeder, der in f.xreadlines 'für Zeile wurde mit() : 'wird es in Zeile für f vor' Jahren umgewandelt haben. –

+0

@John Machin: Ich würde es auch hoffen (obwohl ich es vielleicht nicht erwarte!) Ich wollte damit nicht sagen, dass 'xreadlines' der bevorzugte Weg war, es in Python 2 zu machen - es wurde in Python 2.3 als veraltet betrachtet Die File-as-Iterator-Methode wurde eingeführt. Ich wollte nur den Grund angeben, warum es in Python 3 entfernt werden konnte. –

+2

Ich habe erst vor einer Woche entdeckt, dass Dateien ihre eigenen Iteratoren waren :(Ich schätze, das dient mir dazu, die Tutorial-/Release Notes seit 1.5 nicht zu betrachten. – wbg

7

Andere so viel gesagt haben, schon, aber nur den Punkt nach Hause zu fahren, normale Dateiobjekte sind, ihre eigenen Iteratoren. Es wäre also albern, readlines() einen Iterator zurückzugeben, weil es nur die Datei zurückgibt, die Sie aufgerufen haben. Sie können eine for-Schleife über eine Datei iterieren, wie Scott sagte, und man kann sie auch direkt auf itertools Funktionen übergeben:

from itertools import islice 
f = open('myfile.txt') 
oddlines = islice(f, 0, None, 2) 
firstfiveodd = islice(oddlines, 5) 
for line in firstfiveodd: 
    print(line)