2010-06-23 13 views
26

Die einzige Möglichkeit, die ich in Pythons csv.reader gesehen habe, ist in einer for-Schleife, die die ganze Datei durchläuft, ohne vorherige Werte der eingelesenen Variablen zu speichern. Ich muss nur mit 2 aufeinanderfolgenden Zeilen der (enormen) Datei gleichzeitig arbeiten. Mit der csv.reader for-Schleife habe ich immer nur eine Zeile.Lesen von .csv in Python, ohne die gesamte Datei durchzublättern?

Gibt es eine Möglichkeit, das Csv-Modul von Python zu verwenden, um nur eine Zeile einer csv-Datei aufzunehmen, ohne die Datei bis zum Ende durchlesen zu müssen?

Ich muss Variablen auf die Werte in der ersten Zeile setzen, eine zweite Gruppe von Variablen auf die Werte der nächsten Zeile setzen, die beiden Variablensätze gleichzeitig für Berechnungen verwenden und dann die erste Gruppe von Variablen mit der zweiten Satz, und lesen Sie eine neue Zeile, um den zweiten Satz zu überschreiben.

+1

Können Sie den ersten Satz nicht speichern? – SilentGhost

+0

Ich verstehe die Frage nicht. Fragen Sie, ob ich die erste Zeile in Variablen speichern kann? – mary

+0

Ja, was verhindert, dass Sie die erste Zeile speichern, bis die zweite ankommt, und dann beide verwenden? – SilentGhost

Antwort

40

Es gibt nichts, was Sie zwingt, den Reader in einer Schleife zu verwenden. Lies einfach die erste Zeile und lies dann die zweite Zeile.

import csv 
rdr = csv.reader(open("data.csv")) 
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3 
line2 = rdr.next() 
+0

Sehr hilfreich, danke. Die Art und Weise wurde die Linie I in ihre Säulen Dividieren war: r = csv.reader (open ("data.csv")) für Sp1, Sp2, col3 in r: x = float (spalte1) y = etc ... Wie muss ich diese Methode mit r.next() statt einer for-Schleife anpassen? Mit anderen Worten, wie extrahiere ich die Spalteneinträge aus der gesamten Zeile? – mary

+1

@mary: in meinem Beispiel ist Zeile1 nur eine Liste, so dass Zeile1 [0] die erste Spalte, Zeile1 [1] die zweite Spalte usw. wäre. Wenn Sie möchten, können Sie etwas wie '(Spalte1, Spalte2, Spalte3) = line1' –

+0

In Python 3 verwenden Sie 'next (r)' builtin-Funktion anstelle von 'r.next()' Methode. – smci

2

Die offensichtliche Antwort scheint zu sein, nur die vorherige Zeile bei jeder Iteration zu speichern.

>>> for x in csv.DictReader(stream): 
... print prevLine 
... print x 
... prevLine = x 
.... 
+2

@TK: Dieser Code, so wie er ist, wird fehlschlagen, da Sie prevLine nicht initialisieren. –

3

Blankes Stehlen von TK ... ... meistens bleibt die Frage, was will das OP mit der ersten und letzten Zeile der Datei machen?

prevLine = None 

for x in csv.DictReader(stream): 
    if prevLine is not None: 
     DoWork(prevLine, x) 
    else: 
     Initialize(x) 
    prevLine = x 

Finalize(prevLine) 
+0

Jede Zeile enthält Positionen, dann muss ich Geschwindigkeiten zwischen ihnen berechnen und animiere ein Objekt von einem zum nächsten. Sobald die letzte Position von dem Objekt getroffen wurde, wird das Programm beendet. – mary

+0

Die Antwort auf diese Frage sollte dann informieren, was Sie dann mit den Daten tun müssen. Entweder behandelst du die erste und die letzte Zeile speziell (wie ich es getan habe), oder du musst irgendwie mit "leeren" vorherigen oder nächsten Zeilen an den Enden umgehen. –

4

Wenn Sie sich immer an genau zwei aufeinander folgenden Zeilen suchen, es klingt für mich wie Sie die paarweise von der Verwendung recipe profitieren könnten. Vom itertools Modul:

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

würden Sie diese verwenden, etwa so:

for first_dict, second_dict in pairwise(csv.DictReader(stream)): 
    # do stuff with first_dict and second_dict 
4

CSV lesen:

readCSV = csv.reader(csvFile, delimiter=',') 

Lesen Sie die nächste Zeile in Python 2.7:

row = readCSV.next() 

Lesen Sie die nächste Zeile in Python 3.4:

row = readCSV.__next__() 
+8

Ich würde 'row = next (readCSV)' empfehlen. Dies funktioniert sowohl in Python 2.7 als auch in Python 3 und macht nichts anderes als die Methoden aufzurufen, die Sie beschreiben. – PeterE

Verwandte Themen