嵌套循环不从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个日期和正确格式化他们的罚款。但第二个不断增加它开始的行,我不知道为什么?
csv
变量掩盖了csv
模块。这是等待发生的未来错误。
也就是说,csv
变量也是一个文件读取器的包装。你不会重置它,所以它只会吸引越来越多的线。
如果你想在文件的开头重新启动迭代器,你应该把所有的数据读入列表。
是的,调用它csv是一个错误,那么如果1000行只有1行或2行时,读取整个文件会是一个好主意吗?真正好奇 – lostAstronaut
其实也许这是一个很好的方法来做到这一点,字典可能会更好,但如果我需要多个列对吗? – lostAstronaut
您可以轻松初始化第一个循环内的阅读器,扫描并关闭文件和阅读器。然后在循环中每次都做一遍。我会说这是一个偏好问题。几千行代码没有太多内存,如果您在获得所需内容后删除引用,那么垃圾收集器将为您处理它。 –
因为你在外循环的开始初始化枚举器的csv。所以它只是不断从读者的下一个价值。
如果你想在每次进入内循环时重新开始,要么先读所有的值到列表中的Austing建议或内循环前右创造新的阅读器和枚举
要发生什么事做?你是否期待每次进入'for'循环时'num'从0开始?您是否希望每次都重新启动csv枚举? – tdelaney
我希望num每次都从0开始,这样如果有人最近加入,前几个日期不会被跳过。 – lostAstronaut