Python 从文件读取时间戳并转换为ms

Python 从文件读取时间戳并转换为ms,python,datetime,csv,Python,Datetime,Csv,我正在尝试用Python编写一个程序,该程序将: 将.csv文件作为输入 读取第二行中的时间戳 将每个时间戳之间的时间差打印为毫秒 当我在变量中写入时间戳时,代码可以工作,但是当我尝试使用文件作为输入时,什么也没有发生。程序运行,但没有向控制台打印任何内容 下面是代码的外观: import csv import datetime from Tkinter import Tk from tkFileDialog import askopenfilename Tk().withdraw() t

我正在尝试用Python编写一个程序,该程序将:

  • 将.csv文件作为输入
  • 读取第二行中的时间戳
  • 将每个时间戳之间的时间差打印为毫秒
当我在变量中写入时间戳时,代码可以工作,但是当我尝试使用文件作为输入时,什么也没有发生。程序运行,但没有向控制台打印任何内容

下面是代码的外观:

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
谢谢你的帮助,因为我真的被困在这里了!
谢谢

为什么要拆分
行[1]
返回的内容?这只是一个时间戳,您正在从中创建一个项目列表

然后,在列表理解中,您使用one时间戳迭代该列表,并从中创建一个one
datetime
实例列表

请注意,此时的
len(times)
为1。因此,当对范围内的i(len(times)-1)执行
时,实际上是在
范围(0)
上进行迭代,这是一个空列表

实际上,您想要的是在第一个for循环之外有第二个for循环。或者更好的方法是,用更简单的列表理解替换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)
正如J.F.Sebastian所指出的,通过使用
total_seconds()
而不是手动组合所有3个组件,可以从
timedelta
中更轻松地获得毫秒总数。因为它已经返回了一个微秒分辨率的结果(它是一个浮点),所以只需要乘以1000就可以得到毫秒。如果您想要或不介意小数部分,那么就完成了,否则需要
round()
和/或转换为
int()


如果没有打印任何内容,那么您可能打开了一个空文件。我重新检查了文件,遗憾的是,该文件不是问题所在。可能
行[1]
中只有一个时间戳,没有空格?如果没有样本输入,这是不可能的。您的代码在其他方面看起来是正确的。为什么要以二进制文件打开该文件?添加了我的输入文件示例。我尝试在没有二进制文件的情况下打开该文件,但没有效果。您可以使用
1000*delta.total_seconds()
来获取毫秒。是的,我只是从问题中复制了这一行,没有检查它,因为它与问题无关。但你当然是对的,这是另一个可以改进的部分。@J.F.Sebastian谢谢你的建议,并进行了相应的编辑。谢谢!很好用!您的解释很好地指出了当我看不到错误时我的代码的错误。谢谢
    print(delta.total_seconds() * 1000)
    print(int(delta.total_seconds() * 1000))