2016-05-29 28 views
0

誰かがレースに参加したときにネストされたforループがあります。私が持っている問題は、ユーザーが開催日にない日付を選択した場合、次の「公式」日付にそれらをプッシュしているということです。私はcsvファイルの日付のリストを持っており、それをよく読んでいます。私の問題は、ネストしたループがcsvファイルの開始点をインクリメントし続けることです。ネストされたループが0から始まらない

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() 

ブレークは、ループの開始位置をテストするためだけに2番目のループにあります。私はこのコードを実行するたびに、私は次を得る:

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 

だから、最初のループは5日付で起動し、正しく細かいそれらをフォーマットします。しかし、2番目のものはそれが始まる行を増やし続けているのですが、私はなぜそれが分かりませんか?

+0

? 'for'ループを入力するたびに' num'が0で始まると思いますか?毎回csv列挙を再開しますか? – tdelaney

+0

私はnumが0で始まることを望んでいます。誰かが最近参加すると、最初の数日はスキップされません。 – lostAstronaut

答えて

1

csv変数はcsvモジュールをマスクしています。これは起こるのを待っている未来のバグです。

言い換えれば、変数csvもファイルリーダーの周りのラッパーです。あなたはそれをリセットしないので、それはちょうどより高いラインとより高いラインを引っ張るつもりです。

ファイルの先頭でイテレータを再起動したい場合は、すべてのデータをリストに読み込むだけです。

+0

はい、それをcsvと呼ぶのは間違いでした。さて、実際には1行か2行しか必要としないときは、1000行のファイル全体を読むのは良い考えです。本当に好奇心が強い – lostAstronaut

+0

実際にはそれを行うには良い方法ですが、複数の列が必要な場合は、辞書はおそらくもっと良いでしょうか? – lostAstronaut

+0

最初のループ内で簡単にリーダーを初期化し、スキャンして、ファイルとリーダーを閉じることができます。それから、ループのたびに毎回繰り返します。私はそれが好みの問題だと言いたい。数千行はあまりメモリではありません。あなたが望むものを手に入れた後で参照を削除すると、ガベージコレクタがそれを処理します。 –

0

外部ループの先頭に列挙子を使用してcsvを初期化するためです。だから、読者から次の価値を引っ張ってくるだけです。

あなたは内側のループに入るたびにやり直す、どちらかAustingが示唆したように最初のリストにすべての値を読み取るか、右内側ループの前に新しいリーダーと列挙子を作成したい場合は、あなたが起こるしたい何

関連する問題