2016-06-29 17 views
6

Ich bemerkte, dass, wenn ich über eine Datei, die ich geöffnet habe, iterieren, es viel schneller ist, darüber zu iterieren, ohne es "zu lesen".Python: Wann sollte ich jemals file.read() oder file.readlines() verwenden?

dh

l = open('file','r') 
for line in l: 
    pass (or code) 

ist viel schneller als

l = open('file','r') 
for line in l.read()/l.readlines(): 
    pass (or code) 

Die zweite Schleife um dauern wird 1.5x so viel Zeit (ich habe timeit über die exakt gleiche Datei, und die Ergebnisse waren 0,442 vs 0.660), und würde das gleiche Ergebnis geben.

Also - wann sollte ich jemals die .read() oder .readlines() verwenden?

Da ich immer über die Datei iterieren muss, die ich lese, und nach dem Lernen der harten Weg, wie schmerzhaft verlangsamen die .read() kann auf große Daten - ich kann mir nicht vorstellen, jemals wieder verwenden.

+4

Bitte klären. ist die Zeitmessung für "read" oder für "readlines"?Ich würde erwarten, dass die "read" -Schleife länger dauert, weil sie eine einzelne Zeichenfolge zurückgibt, so dass die Iteration Zeichen für Zeichen durchlaufen würde. Wenn Ihre Datei durchschnittlich 100 Zeichen pro Zeile enthält, wird der Code in der Schleife "for line in l.read()" hundertmal so oft ausgeführt wie der Code in der Schleife "for line in l:". – Kevin

+0

ist es auch für readlines(). Überraschenderweise gibt es fast keinen Zeitunterschied zwischen read() oder readlines() ... –

Antwort

4

Die kurze Antwort auf Ihre Frage ist, dass jede dieser drei Methoden des Bits einer Datei verschiedene Anwendungsfälle hat zu lesen. Wie oben erwähnt, liest f.read() die Datei als eine einzelne Zeichenfolge und ermöglicht so relativ einfache Datei-weite Manipulationen, wie etwa eine dateiweite Regex-Suche oder Substitution.

f.readline() liest eine einzelne Zeile der Datei, so dass der Benutzer eine einzelne Zeile parsen kann, ohne unbedingt die gesamte Datei zu lesen. Die Verwendung von f.readline() kann auch eine einfachere Anwendung der Logik beim Lesen der Datei als eine vollständige zeilenweise Iteration ermöglichen, beispielsweise wenn eine Datei das Format teilweise ändert.

Mithilfe der Syntax for line in f: kann der Benutzer Zeile für Zeile über die Datei iterieren, wie in der Frage angegeben.

(wie in der anderen Antwort erwähnt, ist diese Dokumentation eine sehr gute Lese):

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

EDIT: Es wurde behauptet, vorher, dass Readline-() verwendet werden, um eine Linie während ein überspringen For-Schleife-Iteration. Dies funktioniert jedoch in Python 2.7 nicht und ist vielleicht eine fragwürdige Übung, daher wurde diese Behauptung entfernt.

EDIT: Added ein Beispiel für einen Anwendungsfall von f.readline() und f.read()

+1

Mischen 'readline' mit einer' for'-Schleife über die Datei funktioniert nicht wirklich; 'readline' versteht die Pufferung der 'nächsten' Implementierung nicht. Wenn Sie eine Zeile in einer 'for'-Schleife überspringen möchten, sollten Sie' next' für die Datei aufrufen. – user2357112

+0

Ich habe das gerade mit Python 3.4 getestet. readline() scheint den Schleifenpuffer vorwärts zu bewegen. Lassen Sie mich Python 2 wirklich schnell überprüfen – Checkmate

+0

Ah, Sie sind richtig für Python 2.7. Ich werde meine Antwort bearbeiten. Danke, das ist gut zu wissen! – Checkmate

0

Hoffe, das hilft!

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

Wenn die Größe weggelassen oder negativ ist, wird der gesamte Inhalt der Datei wird gelesen und zurückgegeben; es ist Ihr Problem, wenn die Datei doppelt so groß wie der Speicher Ihres Computers ist

Entschuldigung für alle Änderungen!

Zum Lesen von Zeilen aus einer Datei können Sie das Dateiobjekt durchlaufen. Dies ist ein effizienter Speicher, schnell und führt zu einfachen Code:

for line in f: 
    print line, 

This is the first line of the file. 
Second line of the file 
+0

Das ist keine genaue Beschreibung der API für C oder Python. – user2357112

+0

Ich dachte, ich würde es nicht gut erklären, deshalb habe ich den Rest meiner Antwort direkt aus der Dokumentation gezogen. – Rudi

+0

C liest Dateien standardmäßig nicht zeilenweise ein. Es gibt nicht einmal eine Standardfunktion für das Lesen von Dateien Zeile für Zeile überhaupt in C; 'getline' ist eine POSIX-Erweiterung. Außerdem liest die Schleife über 'f.read()' nicht die gesamte Datei bei jeder Iteration und iteriert nicht über die Zeilen. – user2357112