当有人参加比赛时,我有一个嵌套的for循环。我遇到的问题是,如果用户选择的日期不在所持有的日期,我将他们推到下一个“官方”日期。我在csv文件中有一个日期列表,我读得很好。我的问题是我的嵌套循环在csv文件中不断增加它的起始点。
method4
中断是在第二个循环中,只是为了测试循环的起始位置。每当我运行此代码时,我都会得到以下结果:
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()
所以第一个循环出现5个日期并正确格式化它们。但第二个不断增加它开始的行,我不知道为什么?
答案 0 :(得分:1)
csv
变量屏蔽了csv
模块。这是一个等待发生的未来错误。
也就是说,csv
变量也是文件阅读器的包装器。你没有重置它,所以它只会拉越越来越高的线。
如果要在文件开头重新启动迭代器,您应该只读入所有数据到列表中。
答案 1 :(得分:0)
因为您在外部循环的开头使用枚举器初始化csv。所以它只是不断从阅读器中提取下一个值。
如果你想在每次进入内循环时重新开始,要么首先将所有值读入Austing建议的列表中,要么在内循环之前创建新的阅读器和枚举器