2013-06-05 37 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