python Durchlaufen der Eingabedatei
Meine Frage ist in Bezug auf Datei-input in Python, mit open()
. Ich habe eine text-Datei mytext.txt
mit 3 Linien.
Ich versuche, zwei Dinge zu tun mit dieser Datei: die Linien drucken, und drucken Sie die Anzahl der Zeilen.
Habe ich versucht den folgenden code:
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
for line in input_file:
count_lines += 1
print 'number of lines:', count_lines
Ergebnis: es gibt die 3 Zeilen korrekt, aber druckt "Anzahl der Zeilen: 0" (anstatt 3)
Fand ich zwei Möglichkeiten, es zu lösen, und es zu drucken 3
:
1) ich benutze eine Schleife anstelle von zwei
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
count_lines += 1
print 'number of lines:', count_lines
2) nach der ersten Schleife definiere ich inputfile wieder
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
input_file = open('mytext.txt', 'r')
for line in input_file:
count_lines += 1
print 'number of lines:', count_lines
Mir, wie es scheint, die definition input_file = ...
ist gültig für nur eine Schleife, als ob es gelöscht wurde, nachdem ich es für eine Schleife. Aber ich verstehe nicht, warum, wahrscheinlich ist es nicht 100% klar ist mir noch, wie variable = open(filename)
behandelt in Python.
Durch die Art und Weise, sehe ich, dass in diesem Fall ist es besser, verwenden Sie nur eine Schleife. Allerdings habe ich das Gefühl, ich habe, um diese Frage klar, denn es könnte Fälle geben, wenn ich kann/muss, verwenden Sie es.
readlines()
readlines wird Ihr Computer thrash und möglicherweise Abstürzen, wenn Sie plötzlich es mit einer großen Datei. Es ist in der Regel besser zu Lesen eine Zeile zu einem Zeitpunkt.
Sie können auch die Verwendung mit readline () liest eine Zeile zu einem Zeitpunkt. Oder um zu vermeiden, überlastung/Unfall mit readlines, verwenden Sie das optionale Größe hint parameter: readlines(Größe Hinweis). Das liefert die Anzahl der gesamten Zeilen, die passen in einen Puffer "Größe Hinweis."
InformationsquelleAutor | 2012-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Datei-handle ist ein iterator. Nach Durchlaufen der Datei wird der Zeiger-Position bei EOF (Ende der Datei) und der iterator wird raise StopIteration, die die Schleife beendet. Wenn Sie versuchen, verwenden Sie einen iterator für eine Datei, wo der Zeiger auf EOF wird es nur raise StopIteration-und Ausfahrt: das ist der Grund, warum zählt es null in der zweiten Schleife. Sie können Zurückspulen der Datei-Zeiger mit
input_file.seek(0)
ohne Wiedereröffnung.Sagte, zählen von Zeilen in der Schleife ist mehr I/O-effiziente, ansonsten Lesen Sie die gesamte Datei von der Festplatte ein zweites mal nur zum zählen der Zeilen. Dies ist ein sehr häufiges Muster:
In Python 2.5, die Datei Objekt wurde ausgestattet mit
__enter__
und__exit__
Adresse der- Anweisung interface. Dies ist syntaktischer Zucker für etwas wie:
Ich denke cPython schließen, Datei-handles, wenn Sie die garbage Collection, aber ich bin mir nicht sicher, das gilt für jeden-Umsetzung - IMHO ist es besser, Praxis explizit zu schließen Ressource behandelt.
InformationsquelleAutor Paulo Scardine
Gibt es einige Grund, warum Sie könnte nicht verwenden Sie die folgenden:
Die Sache zurückgegeben öffnen wird ein file-Objekt. Datei-Objekte behalten Ihre eigenen internen position, wie Sie Schleife über Sie, so dass, um zu tun, was Sie versucht zunächst, Sie hätte er es Zurückspulen an den Anfang manuell, es wird nicht von selber.
Danke für die Erklärung, jetzt verstehe ich wie es funktioniert.
InformationsquelleAutor Wug
Versuchen Sie, ein
input_file.seek(0)
zwischen den zwei Schleifen. Dieser wird zum Anfang der Datei zurück an den Anfang, so können Sie die Schleife wieder.InformationsquelleAutor chmeee
Ich dünne das Modul fileinput ist, dass Sie wollen.
Hier ist der link
InformationsquelleAutor BlackMamba