2013-06-05 31 views
3

我試圖用Python語言編寫一個程序,將:從文件讀取時間戳和轉換到MS

  • 採取.csv文件輸入
  • 讀取時間戳在第二排
  • 打印爲MS

當我寫的時間戳在一個變量的代碼工作,但是當我嘗試使用一個文件作爲輸入,沒有任何反應每個時間戳之間的時間差。該程序運行,但沒有打印到控制檯。

這是代碼的外觀:

import csv 
import datetime 
from Tkinter import Tk 
from tkFileDialog import askopenfilename 

Tk().withdraw() 
toopen = askopenfilename(filetypes=[("Text file","*.txt")]) 

with open(toopen, 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    for row in reader: 
     code = row[0] 
     times = row[1].split() 
     times = [datetime.datetime.strptime(x, "%H:%M:%S.%f") for x in times] 
     for i in range(len(times) - 1): 
      delta = times[i + 1] - times[i] 
      print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds/1000) 

這裏是我的輸入文件的外觀的樣本。

input23 13:13:05.674430 
input47 13:13:06.623822 
input52 13:13:07.573215 
input66 13:13:08.522607 

任何幫助被讚賞,因爲我真的被卡在這裏! 謝謝

+0

如果沒有被打印出來,然後你或許打開一個空文件。 –

+0

我重新檢查了一下,可惜的是,這個文件並不是問題。 –

+0

或許'row [1]'只有*一個*時間戳,沒有空格?沒有樣本輸入,這是不可能分辨的。你的代碼看起來不正確。 –

回答

1

你爲什麼分裂row[1]返回?這只是一個時間戳,你正在製作一個一個項目的清單。

然後,在列表理解,你遍歷該列表與一個時間戳,使一個datetime實例的列表,從它。

請注意,該點的len(times)爲1.因此,在執行for i in range(len(times) - 1)時,您有效地重複了range(0)這是一個空列表。

你真正想要的是在第一個之外有第二個循環。甚至更好,用一個簡單的列表中理解更換整個第一for row in reader:循環,就像這樣:

reader = csv.reader(f, delimiter='\t') 
times = [datetime.datetime.strptime(timestamp, "%H:%M:%S.%f") for _, timestamp in reader] 

for i in range(len(times) - 1): 
    delta = times[i + 1] - times[i] 
    print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds/1000) 

如果你願意,你可以通過遍歷對的提高通過更換range()剩餘for循環和索引datetime實例,並zip()其繼任荷蘭國際集團該名單由一個地方,這無疑是一丁點更具可讀性和Python的移動版本的本身:

reader = csv.reader(f, delimiter='\t') 
times = [datetime.datetime.strptime(timestamp, "%H:%M:%S.%f") for _, timestamp in reader] 

for time1, time2 in zip(times, times[1:]): 
    delta = time2 - time1 
    print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds/1000) 

由於JF塞巴斯蒂安指出,你可以得到總數毫秒很多通過使用total_seconds()而不是手動組合所有3個組件,從timedelta開始。既然這已經以微秒的分辨率返回結果(這是一個浮點數),你只需要乘以1000來得到毫秒。如果你想要或不介意的小數部分,你就大功告成了,否則你需要round()和/或轉換爲int()

print(delta.total_seconds() * 1000) 

print(int(delta.total_seconds() * 1000)) 
+1

你可以使用'1000 * delta.total_seconds()'獲得毫秒。 – jfs

+0

是的,我剛剛從問題中複製了該行,並沒有打擾檢查它,因爲它與問題無關。但你當然是對的,這是另一個可以改進的部分。 – blubberdiblub

+0

@ J.F.Sebastian感謝您的建議,並進行了相應編輯。 – blubberdiblub