2012-03-15 79 views
2

我想在for循環中嵌套for語句。但是,在下面的示例中,變量d在for語句完成後不會增加一天。我通過在屏幕上打印d來確定這一點。爲什麼While While語句結束時的增量器不會觸發

while d <= end: 
    for row in reader: 
     rowDate = datetime.datetime.strptime(row[0], "%m/%d/%Y") 
     if row[1] == offer and rowDate == d: 
      rowList.append("1") 
    d += datetime.timedelta(days=1) 

當我按如下縮進增量器時,它會執行。但是這不是我們期望的結果,因爲我不希望它在for語句的每次迭代時增加。

while d <= end: 
    for row in reader: 
     rowDate = datetime.datetime.strptime(row[0], "%m/%d/%Y") 
     if row[1] == offer and rowDate == d: 
      rowList.append("1") 
     d += datetime.timedelta(days=1) 

有可能是我無法掌握的基本的Python的東西。有人可以解釋爲什麼D增量在第二個例子中,但不是在第一個?

+0

如果while循環只運行一次,那就表明'd == end' ... – Interrobang 2012-03-15 22:35:47

+0

確實'reader'有任何行? rowList和rowDate如何查看每個的結尾? – FakeRainBrigand 2012-03-15 22:37:24

+0

正好在增量之後打印(在循環中)。你看到了什麼? :) – 2012-03-15 22:38:52

回答

2

csv.reader返回發生器。一旦你過去了,它就會被消耗掉。你不能迭代它兩次而不重新實例化它。這是因爲通常你不需要一遍又一遍地閱讀它。你可以重寫你的代碼是這樣的:

for row in reader: 
    rowDate = datetime.datetime.strptime(row[0], "%m/%d/%Y") 
    if row[1] == offer and start_date<=rowDate<=end_date: 
     # start_date and end_date are datetime objects 
     rowList.append("1")