Was ist in Python der Unterschied zwischen f.readlines () und list (f)?

8

Sowohl aus Python2 Tutorial als auch Python3 Tutorial , es gibt eine Zeile im Mittelpunkt von Abschnitt 7.2.1 sagen:

  

Wenn Sie alle Zeilen einer Datei in einer Liste lesen möchten, können Sie auch list(f) oder f.readlines().

verwenden

Meine Frage ist also: Was ist der Unterschied zwischen diesen beiden Möglichkeiten, ein Dateiobjekt in eine Liste zu verwandeln? Ich bin sowohl im Performance-Aspekt als auch in der Python-Objekt-Implementierung (und vielleicht auch im Unterschied zwischen Python2 und Python3) neugierig.

    
YaOzI 30.05.2014, 15:31
quelle

1 Antwort

12

Funktionell gibt es keinen Unterschied; Beide Methoden führen zu genau derselben Liste.

Zur Implementierung verwendet man das Dateiobjekt als Iterator (ruft next(f) wiederholt auf bis StopIteration ausgelöst wird, verwendet der andere eine dedizierte Methode, um die ganze Datei zu lesen.

Python 2 und 3 unterscheiden sich genau darin, ob Sie io.open() in Python 2. Python 2-Dateiobjekte verwenden einen versteckten Puffer für die Dateiiteration , die Sie stolpern können, wenn Sie Dateiobjekt-Iteration und .readline() oder .readlines() -Aufrufe mischen.

Die io -Bibliothek (die alle Datei-I / O in Python 3 verarbeitet) verwendet keinen solchen versteckten Puffer, die gesamte Pufferung wird stattdessen von einem BufferedIOBase() Wrapper-Klasse . Tatsächlich verwendet die io.IOBase.readlines() -Implementierung das Dateiobjekt als Iterator unter der Haube sowieso und TextIOWrapper Iteration delegierte an TextIOWrapper.readline() , also sind list(f) und f.readlines() im Grunde die gleichen Dinge, wirklich.

Im Hinblick auf die Performance gibt es auch in Python 2 keinen wirklichen Unterschied, da der Flaschenhals Datei-I / O ist; Wie schnell können Sie es von der Festplatte lesen? Auf einer Mikroebene kann die Leistung von anderen Faktoren abhängen, z. B. wenn das Betriebssystem die Daten bereits gepuffert hat und wie lange die Leitungen sind.

    
Martijn Pieters 30.05.2014, 15:35
quelle