2016-03-24 10 views
2

Ich möchte ein CSV-Dokument durchlaufen und oft überprüfen Sie die nächste Zeile für Werte, aber bei der gleichen Zeilennummer bleiben. Das .next() überspringt eine Zeile, die für mich nicht funktioniert, wenn ich nicht irgendwie zurückgehen könnte. Gibt es dafür einen einfachen Weg? Ich habe den paarweise/Zyklus versucht, aber es dauert viel zu lange, wenn die Datei groß ist. Mein Beispielcode ist:Python - Schleife durch CSV-Datei und nächste Zeile überprüfen

file1 = open("name.csv", 'rb') 
reader = csv.DictReader(file1) 
new_rows_list = [] 

for row in reader: 
    if row['IsFixated'] == 'TRUE': 
     new_row = [row['Result'], 'Fixation'] 
     new_rows_list.append(new_row) 
    else: 
     new_row = [row['Result'], 'Saccade'] 
     new_rows_list.append(new_row) 
     nextRow = reader.next() # check for next row ?? 
     if nextRow['IsFixated'] == 'TRUE': 
      new_rows_list = CheckPreviousPositions(new_rows_list) 

file1.close() 

Antwort

2
reader1,reader2 = itertools.tee(csv.DictReader(file1)) 
#this creates two copies of file iterators for the file 
next(reader2) #skip first line in second filehandle 
for line,next_line in itertools.izip(reader1,reader2): 
    #do something? 

Ich denke, ... vielleicht?

0

Wenn Sie nur die nächste Zeile dieser Generator-Funktion überprüfen müssen, sollten Sie Ihre Datei und fügen Sie die erste und die zweite Zeile der curr_and_next Liste der Trick

def next_reader(file_name): 
    with open(file_name) as f: 
     reader = csv.reader(f) 
     check = 0 
     curr_and_next = [] 
     while True: 
      if check == 0: 
       first = reader.next() 
       second = reader.next() 
       curr_and_next = [first, second] 
       check = 1 
      else: 
       curr_and_next = [curr_and_next[1], reader.next()] 
      yield curr_and_next 

Dies eröffnet und gibt es zurück. Bei jedem nachfolgenden Aufruf wird der zweite Wert in curr_and_next in den ersten Punkt verschoben und dann die nächste Zeile in der Datei in den zweiten Punkt eingefügt. Jetzt liefert dieser Generator keine Zeile mehr, sondern eine Liste mit der nächsten Zeile und der darauf folgenden Zeile. Wenn Sie zum Beispiel eine CSV-Datei alpha.csv mit den Zeilen:

a,b 
c,d 
e,f 

und Sie haben eine Schleife:

for x in next_reader('alpha.csv'): 
    print x 

dies drucken:

[['a','b'],['c','d']] 
[['c','d'],['e','f']] 

Beachten Sie, dass die letzte Zeile in Ihrer CSV-Datei wird nur einmal in der allerletzten Iteration angezeigt. (Sie erhalten für den letzten Ausdruck nicht so etwas wie [['e','f'],None]).

Verwandte Themen