我有一个csv文件,我试图迭代并让它只在其中的时间戳落在指定范围内时才会执行某些操作。我使用while循环来执行此操作,我每次都会添加30秒,但由于某种原因,它只会在第一次循环时迭代csv而不是每次添加时间(尽管我知道它正在成功完成while循环本身)。我不确定问题是什么。
try:
csvfilename = sys.argv[1]
except:
csvfilename = "myCSVfile.csv"
csvfile = csv.DictReader(open(csvfilename,'rb'),delimiter=',')
startTime = 1402617311
endTime = 1419544361
while startTime < endTime:
for line in csvfile:
if (startTime + 30) > timeToEpoch(line['EnterTime']) >= startTime:
output = calcFunction(line['EnterN'],line['ExitN'],line['user'])
startTime = startTime + 30
这里的每个请求是使用csv模块打印的几行csv文件(为了便于阅读而格式化了一些,名称和我的例子的差异也因为我稍微改了一下):
{
'Time Exit': '17:02:04',
'Duration': '0:02:34',
'Date': '12/7/14',
'ExitN': '12/7/14 17:02',
'PlayerSpace': '1',
'EnterN': '12/7/14 16:59',
'Time Enter': '16:59:30'
}
{
'Time Exit': '17:08:18',
'Duration': '0:08:46',
'Date': '12/7/14',
'ExitN': '12/7/14 17:08',
'PlayerSpace': '2',
'EnterN': '12/7/14 16:59',
'Time Enter': '16:59:32'
}
{
'Time Exit': '17:06:49',
'Duration': '0:04:20',
'Date': '12/7/14',
'ExitN': '12/7/14 17:06',
'PlayerSpace': '3',
'EnterN': '12/7/14 17:02',
'Time Enter': '17:02:29'
}
答案 0 :(得分:2)
当您第一次迭代csvfile
时,您会耗尽它,以便它永远不会产生更多值。
您的问题的一个解决方案可能是将所有行复制到列表中,该列表可以多次迭代:
startTime = 1402617311
endTime = 1419544361
csv_lines = list(csvfile) # <-
while startTime < endTime:
for line in csv_lines: # <-
if (startTime + 30) > timeToEpoch(line['EnterTime']) >= endTime:
output = calcFunction(line['EnterN'],line['ExitN'],line['user'])
startTime = startTime + 30
答案 1 :(得分:0)
所以这是基于Andrea的建议我将它移动到一个列表(),这很好,但我真正需要做的是每30秒检查一次条件,这使得它每30秒迭代一次(制作它真的很慢)因此我对它进行了调整并略微加快了速度,因为我的所有时间都是连续的,这是有效的:
line = list(csv_data) #Convert into a list
lineCount = line[n] # Done so I can iterate line by line
while (startTime + 30) > timeToEpoch(lineCount['EnterN']) >= startTime:
print "time on"
pc = playerCount(lineCount['EnterN'],lineCount['ExitN'],lineCount['Player'])
n += 1
lineCount = line[n]
注意:抱歉,我的原始代码中有一些小错误,其中endTime / startTime不影响人们的答案,但我改变了最终答案(其中一些是因为我重命名变量以减少混淆)