2015-05-08 70 views
2

我有一個csv文件,我試圖遍歷並讓它只在其中的時間戳落在指定範圍內時才執行某些操作。我使用的是一個while循環來做到這一點,我每次都增加30秒,但由於某種原因,它只是在第一次循環時迭代csv,而不是每次增加時間(儘管我知道它已經成功完成while循環本身)。我不確定是什麼問題。Python:在while循環中循環訪問csv

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

向我們展示CSV文件的相關示例。使用['csv'](https://docs.python.org/3.4/library/csv.html)模塊。 –

+1

這可能有助於:http://stackoverflow.com/questions/2868354/reading-from-csvs-in-python-repeatedly –

+0

Hey Ziyao Wei - 這絕對似乎讓我更接近,但當我嘗試'csvfile.seek(0 )''我得到'AttributeError:DictReader實例沒有屬性'seek''(我用'csv.DictReader'來讀取我的csv文件) – Mike

回答

0

所以這是基於安德烈的建議,我把它移動到列表(),這工作很好,但我真正需要做的是每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] 

不是e:對不起,我的原始代碼中有一些小錯誤,並且endTime/startTime不會影響人們的答案,但是我在最終答案中有所改變(其中一些原因是我爲了減少混淆而重命名變量)

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 
+0

這讓我非常接近 - 我做了一些調整,我會在上面展示,因爲這使得它在csv中迭代了一個很長的等待時間的項目 – Mike

+1

@Mike:你也可以創建(並接受)你自己的答案。 –

+0

良好的通話 - 爲了清晰起見,我還添加了我的通話 - 但要確保我給你的信用讓我在那裏!謝謝 – Mike