Durchlaufen Sie die Datei, um Zeilen zu lesen:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Dateiobjekte sind iterierbar und ergeben bis EOF Linien. Wenn Sie das Dateiobjekt als iterable verwenden, wird ein Puffer verwendet, um performante Lesevorgänge sicherzustellen.
Sie können dasselbe mit dem stdin tun (keine Verwendung erforderlich raw_input()
:
import sys
for line in sys.stdin:
do_something()
Um das Bild zu vervollständigen, können binäre Lesevorgänge durchgeführt werden mit:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
Dabei chunk
enthält die Datei bis zu 1024 Byte gleichzeitig. Die Iteration wird beendet, wenn openfileobject.read(1024)
leere Byte-Zeichenfolgen zurückgegeben werden.
line
wird ein neues Zeilenzeichen angezeigt.stdin
laufenden Prozess ... also hat es nie EOF, bis ich den Prozess beendet habe. Aber dann erreiche ich das "Ende bis jetzt" und bin festgefahren. Wie erkenne ich das und keinen Deadlock? Wenn keine neuen Zeilen vorhanden sind, hören Sie auf, die Dateien zu lesen (auch wenn kein EOF vorhanden ist, der in meinem Fall niemals vorhanden sein wird).Sie können das C-Idiom in Python imitieren.
So lesen Sie einen Puffer bis zu einer
max_size
Anzahl von Bytes:Oder eine Textdatei Zeile für Zeile:
Sie müssen
while True / break
Konstrukt verwenden, da es in Python keinen anderen Eof-Test gibt als das Fehlen von Bytes, die von einem Lesevorgang zurückgegeben werden.In C haben Sie möglicherweise:
In Python ist dies jedoch nicht möglich:
da Zuweisungen in Ausdrücken in Python nicht zulässig sind (obwohl neuere Versionen von Python dies mithilfe von Zuweisungsausdrücken nachahmen können, siehe unten).
Es ist sicherlich mehr idiomatische in Python zu tun:
Update: Seit Python 3.8 können Sie auch Zuweisungsausdrücke verwenden :
quelle
readline()
Methode einen Vorteil hat : Sie können eine feinkörnige Fehlerbehandlung wie das Fangen durchführenUnicodeDecodeError
, was Sie mit der idiomatischenfor
Iteration nicht tun können .Die Python-Sprache zum Öffnen und zeilenweisen Lesen einer Datei lautet:
Die Datei wird am Ende des obigen Codes automatisch geschlossen (das
with
Konstrukt kümmert sich darum).Schließlich ist anzumerken, dass
line
die nachfolgende Newline erhalten bleibt. Dies kann leicht entfernt werden mit:quelle
for line in f.readlines(): ...
, häufig vorgeschlagene Lösung.Sie können das folgende Codefragment verwenden, um Zeile für Zeile bis zum Ende der Datei zu lesen
quelle
Zwar gibt es oben Vorschläge für "Python-Methode", aber wenn man wirklich eine auf EOF basierende Logik haben möchte, dann ist die Verwendung der Ausnahmebehandlung vermutlich die richtige Methode -
Beispiel:
Oder drücken Sie Ctrl-Zan einer
raw_input()
Eingabeaufforderung (Windows, Ctrl-ZLinux)quelle
Sie können das folgende Code-Snippet verwenden. readlines () liest die gesamte Datei auf einmal ein und teilt sie zeilenweise auf.
quelle
Zusätzlich zu der großartigen Antwort von @ dawg gibt es die entsprechende Lösung mit dem Walross-Operator (Python> = 3.8):
quelle