2016-05-29 3 views
0

Ich habe eine verschachtelte For-Schleife für wenn jemand das Rennen betritt. Das Problem, das ich habe, ist, dass, wenn ein Benutzer ein Datum auswählt, das nicht an den Daten gehalten wird, ich sie zum nächsten "offiziellen" Datum dränge. Ich habe eine Liste von Daten in einer CSV-Datei und ich lese es gut. Mein Problem ist, dass meine Nested-Schleife den Startpunkt in der CSV-Datei erhöht.Verschachtelte Schleife nicht bei 0 beginnend

import csv, time 
from datetime import date, timedelta 

class RunDates(): 

    def __init__(self): 
     self.enterDate = '4/12/14' 
     self.reader = csv.DictReader(open('dates.csv', 'rb')) 

    def findRunDate(self): 

     # Get the row of entered date or next closest 
     csvlist = enumerate(self.reader) 
     for i in range(5): 
      t = time.strptime(self.enterDate, '%m/%d/%y') 
      newdateArr = (date(t.tm_year, t.tm_mon,t.tm_mday)+timedelta(days=i)).strftime('%m/%d/%y').split('/') 
      newdateStr = '/'.join([str(int(newdateArr[0])), str(int(newdateArr[1])), newdateArr[2]]) 
      print newdateStr, i 

      for num, row in csvlist: 
       print row['Date'], num 
       break 
       if newdateStr == row['Date']: 
        print 'Row Number: ' + str(num) 
        print 'Row Date: ' + row['Date'] 
        print 'new Date: ' + newdateStr 
        break 
       else: 
        pass 



#Testing 
a = RunDates() 
a.findRunDate() 

Die Pause ist in der zweiten Schleife, nur um zu testen, wo die Schleife beginnt. Jedes Mal, wenn ich diesen Code ausführen bekomme ich folgendes:

4/12/14 0 
4/29/16 0 
4/13/14 1 
4/28/16 1 
4/14/14 2 
4/27/16 2 
4/15/14 3 
4/26/16 3 
4/16/14 4 
4/25/16 4 

So die erste Schleife kommt mit 5 Termine und korrekt formatiert sie in Ordnung. Aber der zweite erhöht die Reihen immer weiter und ich weiß nicht warum?

+0

Was Sie passieren wollen ? Erwarten Sie, dass 'num' bei jedem Aufruf der' for'-Schleife bei 0 beginnt? Soll die csv-Enumeration jedes Mal neu gestartet werden? – tdelaney

+0

Ich möchte, dass num jedes Mal bei 0 beginnt, also wenn jemand vor kurzem beitreten würde, würden die ersten Daten nicht übersprungen werden. – lostAstronaut

Antwort

1

Die csv Variable verdeckt das csv Modul. Dies ist ein zukünftiger Bug, der darauf wartet, zu passieren.

Das gesagt, die csv Variable ist auch ein Wrapper um einen Dateileser. Sie setzen das nicht zurück, also zieht es nur höhere und höhere Zeilen.

Wenn Sie den Iterator am Anfang der Datei neu starten möchten, sollten Sie wahrscheinlich alle Daten in eine Liste einlesen.

+0

Ja, es csv zu nennen war ein Fehler, nebenbei denkst du, es wäre eine gute Idee, die ganze Datei zu lesen, wenn ihre 1000 Zeilen lang sind, wenn ich wirklich nur 1 oder 2 Zeilen brauche? Echt neugierig – lostAstronaut

+0

Eigentlich ist das vielleicht ein guter Weg, ein Wörterbuch wäre wahrscheinlich besser, wenn ich mehr als eine Spalte brauche, oder? – lostAstronaut

+0

Sie könnten den Leser innerhalb der ersten Schleife genauso einfach initialisieren, durchsuchen und dann die Datei und den Leser schließen. Dann wiederhole es für jedes Mal durch die Schleife. Ich würde sagen, es war eine Frage der Vorliebe. Mehrere tausend Zeilen sind nicht viel Speicher, und wenn Sie die Referenzen löschen, nachdem Sie haben, was Sie wollen, wird der Müllsammler sich darum kümmern. –

0

Weil Sie csv mit Enumerator am Anfang der äußeren Schleife initialisieren. Es zieht also immer die nächsten Werte aus dem Leser.

Wenn Sie jedes Mal von vorne beginnen Sie die innere Schleife eingeben, entweder alle Werte in der Liste zuerst lesen als Austing neuen Leser und enumerator vorgeschlagen oder erstellen Sie direkt vor der inneren Schleife

Verwandte Themen