嵌套循环不从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() 

该中断在第二个循环中,仅用于测试循环开始的位置。每当我运行此代码,我得到以下几点:

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个日期和正确格式化他们的罚款。但第二个不断增加它开始的行,我不知道为什么?

+0

要发生什么事做?你是否期待每次进入'for'循环时'num'从0开始?您是否希望每次都重新启动csv枚举? – tdelaney

+0

我希望num每次都从0开始,这样如果有人最近加入,前几个日期不会被跳过。 – lostAstronaut

csv变量掩盖了csv模块。这是等待发生的未来错误。

也就是说,csv变量也是一个文件读取器的包装。你不会重置它,所以它只会吸引越来越多的线。

如果你想在文件的开头重新启动迭代器,你应该把所有的数据读入列表。

+0

是的,调用它csv是一个错误,那么如果1000行只有1行或2行时,读取整个文件会是一个好主意吗?真正好奇 – lostAstronaut

+0

其实也许这是一个很好的方法来做到这一点,字典可能会更好,但如果我需要多个列对吗? – lostAstronaut

+0

您可以轻松初始化第一个循环内的阅读器,扫描并关闭文件和阅读器。然后在循环中每次都做一遍。我会说这是一个偏好问题。几千行代码没有太多内存,如果您在获得所需内容后删除引用,那么垃圾收集器将为您处理它。 –

因为你在外循环的开始初始化枚举器的csv。所以它只是不断从读者的下一个价值。

如果你想在每次进入内循环时重新开始,要么先读所有的值到列表中的Austing建议或内循环前右创造新的阅读器和枚举