2012-03-22 57 views
0

我有日志文件日期和时间在Python语言

Thu Mar 22 21:14:36 2012; TCP; 
Thu Mar 22 21:15:15 2012; TCP; 
Thu Mar 22 21:16:23 2012; TCP; 
Thu Mar 22 21:17:51 2012; TCP; 
Thu Mar 22 21:18:45 2012; TCP; 

我需要得到日志的最后三分钟,剧本必须是在Python 我试图用日期时间和切片功能。

import datetime 
x=datetime.datetime.now() 
print x #result 2012-03-22 21:19:09.918804 

但是,当我切的日期,只留下时,系统产生错误

a=x[11:20] 

...类型错误:“datetime.datetime”对象是unsubscriptable ... 我知道该算法应该工作得很好:当前时间,需要三分钟,但我没有任何想法......但缺乏知识

+0

请澄清你的问题。 TypeError是正常的:'x'不是一个字符串,它是一个日期时间对象。你的三分钟时间间隔在哪里?提示:如果你正在处理间隔,你应该期望在你的代码中找到'datetime.timedelta'。你在哪里阅读日志文件并比较时间? – Celada 2012-03-22 18:47:33

回答

2

当您调用datetime.datetime.now() python返回一个日期时间对象,而不是一个字符串。这就是为什么你无法直接从中分一杯羹的原因。当你打电话给print x时,python内部调用str(x)以你看到的方式格式化它。所以,你需要a = str(x)[11:20]

但是,更好的解决方案是使用datetime.strftime

从datetime.strftime开始,如果您想从您预先存在的日志文件中获取日期时间对象(为了检查时间是否在最近3分钟内),可以使用类似datetime.strptime所以:datetime.strptime(line.split(';',1)[0],"%a %b %H:%M:%S %Y)

+0

我相信真正的问题实际上是“我如何从最后3分钟提取日志行”。 – EOL 2012-03-23 00:33:55

2

datetime.datetime对象不支持切片。我想你想要做的是str(x)[11:20]:即,将x转换为一个字符串(这是print x显示的内容)并采用该字符串的11:20索引。

更好的可能是使用strftimex.strftime("%H:%M:%S")

但是:一旦你有了这个字符串,你需要做一些比较,我不完全确定你是怎么做的。你可能需要去另一个方向:

import datetime 
import sys 

cutoff = datetime.datetime.now() - datetime.timedelta(minutes=3) 
line_format = "%a %b %d %H:%M:%S %Y; TCP;" 

lines = iter(sys.stdin) # or iter(f) for a file object f 

# skip all the lines before three minutes ago 
for line in lines: 
    logtime = datetime.datetime.strptime(line.strip(), line_format) 
    if logtime >= cutoff: 
     print line 
     break 

# print out the rest of the lines 
for line in lines: 
    print line 

这可能会更有趣,但我认为这样做。如果strptime格式不完全正确,或者行的实际内容不是"TCP;",则可能需要执行一些字符串处理。

+0

感谢您的帮助 – nosensus 2012-03-22 19:12:13

+0

+1:这段代码看起来很完美。 :) – EOL 2012-03-23 00:35:13