Wie lese ich zwei Zeilen aus einer Datei gleichzeitig mit Python
Ich bin der Codierung ein python-Skript analysiert eine text-Datei. Das format der text-Datei ist, so dass jedes element in der Datei verwendet zwei Linien und der Einfachheit halber würde ich gerne Lesen die beiden Linien vor der Analyse. Geht das in Python?
Ich würde gerne einige so etwas wie:
f = open(filename, "r")
for line in f:
line1 = line
line2 = f.readline()
f.close
Aber diese bricht nämlich:
ValueError: Mischen iteration und read-Methoden verlieren würde, die Daten
Verwandte:
Kommentar zu dem Problem
Änderung f.readline() , f.die next () - und Sie sind alle gesetzt.
Siehe stackoverflow.com/questions/1528711/reading-lines-2-at-a-time für weitere Antworten.
InformationsquelleAutor der Frage Daniel | 2009-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ähnliche Frage hier. Sie können nicht mischen-iteration und readline, so müssen Sie eins oder das andere.
InformationsquelleAutor der Antwort robince
izip_longest gibt einen iterator, so sollte es gut funktionieren, auch wenn die Datei sehr groß ist.
Wenn es eine ungerade Anzahl von Zeilen, dann Zeile2, bekommt Sie den Wert auf None auf der letzten iteration.
izip_longest ist in itertools, wenn Sie müssen python 2.6 oder höher. Wenn Sie eine Vorherige version, die Sie abholen können eine python-Implementierung von izip_longest hier. In Python ist3,
itertools.izip_longest
umbenanntitertools.zip_longest
.In die Kommentare, es wurde gefragt, ob diese Lösung liest die gesamte Datei zuerst, und dann durchläuft die Datei ein zweites mal.
Ich glaube, dass es nicht. Die
with open('a') as f
Zeile öffnet sich ein Datei-handle, aber nicht die Datei Lesen.f
ist ein iterator, so wird sein Inhalt nicht Lesen, bis angefordert. izip_longest nimmt Iteratoren als Argumente und gibt einen iterator.izip_longest ist in der Tat fed die gleichen iterator, f, zweimal. Aber was schließlich passiert ist, dass f.next() (bzw.(f) in Python ist3) aufgerufen wird, auf das erste argument und dann auf das zweite argument. Da next() aufgerufen wird, auf der gleichen zugrunde liegenden iterator, aufeinander folgenden Zeilen ergeben. Dies ist ganz anders als das Lesen in der ganzen Datei. In der Tat der Zweck der Verwendung von Iteratoren ist, gerade um zu vermeiden das Lesen in der ganzen Datei.
Daher glaube ich die Lösung funktioniert wie gewünscht -- die Datei wird nur einmal gelesen, die durch die for-Schleife.
Zu diesem Punkt lief ich die izip_longest-Lösung gegenüber einer Lösung mit
f.readlines()
. Ich habe eine raw_input() am Ende anhalten des Skripts, und liefps axuw
auf jede:unutbu 11119 2.2 0.2
4520 2712pts/0 S+ 21:14 0:00 python /home/unutbu/pybin/izip_longest_method.py bigfile
unutbu 11317 6.5 8.8
93908 91680pts/0 S+ 21:16 0:00 python /home/unutbu/pybin/readlines_method.py bigfile
Den
readlines
klar liest die ganze Datei auf einmal. Da dieizip_longest_method
verwendet viel weniger Speicher, ich denke, es ist sicher zu dem Schluss, es nicht zu Lesen in die ganze Datei auf einmal.InformationsquelleAutor der Antwort unutbu
verwenden Sie line.next(), eg
InformationsquelleAutor der Antwort ghostdog74
Ich würde fortfahren, in einer ähnlichen Weise wie ghostdog74, nur mit der versuchen draußen und ein paar Modifikationen:
Dies hält den code einfach und doch robust. Mit der
with
schließt die Datei, wenn etwas anderes passiert, oder schließt einfach die Ressourcen einmal erschöpft sind Sie und beenden Sie die Schleife.Beachten Sie, dass
with
Bedürfnisse 2.6 oder 2.5 mit derwith_statement
- Funktion aktiviert.InformationsquelleAutor der Antwort RedGlyph
Arbeitet für gerade und ungerade-Länge-Dateien. Es ignoriert die unübertroffene letzten Zeile.
Wenn Sie große Dateien, ist dies nicht der richtige Ansatz. Sie laden die Datei in den Speicher mit readlines(). Ich schrieb einmal eine Klasse, Lesen Sie die Datei speichern der fseek-position von jedem Zeilenanfang. Dies ermöglicht Ihnen, bestimmte Zeilen, ohne dass alle die Datei in den Speicher, und Sie können auch vorwärts und rückwärts gehen.
Ich füge es hier. Lizenz ist Public domain, was bedeutet, zu tun, was Sie wollen mit ihm. Bitte beachten Sie, dass diese Klasse wurde geschrieben 6 Jahren, und ich habe nicht berührt oder kontrolliert es da. Ich denke, es ist auch nicht die Datei kompatibel ist. Caveat emptor. Beachten Sie auch, dass dies übertrieben ist, für Ihr problem. Ich bin nicht fordern, sollten Sie auf jeden Fall diesen Weg gehen, aber ich hatte diesen code und ich genieße es wenn Sie mehr brauchen komplexe access.
InformationsquelleAutor der Antwort Stefano Borini
wie über diese eine,, niemand zu sehen, ein problem mit ihm
InformationsquelleAutor der Antwort svural
InformationsquelleAutor der Antwort Martin P. Hellwig
InformationsquelleAutor der Antwort Georg Schölly
Jetzt können Sie die Datei Lesen, alle zwei Linie. Wenn Sie möchten, können Sie auch überprüfen Sie den f-status vor
f.next()
InformationsquelleAutor der Antwort Kimmi
Meine Idee ist, erstellen Sie einen generator, liest zwei Zeilen aus der Datei zu einem Zeitpunkt, und gibt dieses als ein 2-Tupel, Das heißt, Sie können dann die Ergebnisse Durchlaufen.
Wenn Sie eine ungerade Anzahl von Zeilen, funktioniert es nicht perfekt, aber dies sollte Ihnen einen guten überblick.
InformationsquelleAutor der Antwort Simon Callan
Habe ich ein ähnliches problem letzten Monat. Ich habe versucht, eine while-Schleife mit f.readline() sowie f.readlines().
Meine Daten-Datei ist nicht sehr groß, so dass ich schließlich für f ist.readlines(), das gibt mir mehr Kontrolle über den index, sonst
Ich habe mittels f.seek() zu hin und her bewegen des Dateizeigers.
Meinem Fall ist komplizierter, als OP. Da meine Daten-Datei ist flexibler, wie viele Zeilen analysiert werden, jedes mal, so
Ich habe zu prüfen, ein paar Bedingungen vor, ich kann die Daten analysieren.
Einem anderen problem, das ich fand heraus, über f.seek() ist, dass es gar nicht mit utf-8 sehr gut wenn ich die benutzen codecs.open(", 'r', 'utf-8'), (nicht ganz sicher über den Täter ist, schließlich gab ich auf diesen Ansatz.)
InformationsquelleAutor der Antwort Dingle
Einfache kleine Leser. Es ziehen die Linien in Paaren von zwei und Sie wieder als Tupel, da man die Iteration über das Objekt. Sie können schließen Sie es manuell, oder es wird sich zu schließen, wenn Sie außerhalb des gültigen Bereichs.
InformationsquelleAutor der Antwort Bo Buchanan
Wenn die Datei ist von angemessener Größe, ein anderer Ansatz, der verwendet list-comprehension zum Lesen der gesamten Datei in eine Liste von 2-Tupeln, ist dies:
InformationsquelleAutor der Antwort prismalytics.io
Dieser Python-code wird gedruckt, die ersten beiden Zeilen:
InformationsquelleAutor der Antwort Timothy.hmchen