我有日志文件
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 我试着使用datetime和slice函数。
import datetime
x=datetime.datetime.now()
print x #result 2012-03-22 21:19:09.918804
但是当我剪切日期并只留下时间时,系统会生成错误
a=x[11:20]
... TypeError:'datetime.datetime'对象是unsubscriptable ... 我知道算法应该运行良好:当前时间,需要三分钟,但我没有任何想法......而是缺乏知识
答案 0 :(得分:2)
当你调用datetime.datetime.now()
时,python返回一个datetime对象,而不是一个字符串。这就是为什么你不能直接从它切片。当您调用print x
时,python会在内部调用str(x)
以您看到的方式对其进行格式化。所以,您需要a = str(x)[11:20]
。
但是,更好的解决方案是使用datetime.strftime。
作为来自datetime.strftime的segue,如果您想从预先存在的日志文件中获取日期时间对象(为了检查时间是否在过去3分钟内),您可以使用{{3像这样:datetime.strptime(line.split(';',1)[0],"%a %b %H:%M:%S %Y)
。
答案 1 :(得分:2)
datetime.datetime
个对象不支持切片。我认为你要做的是str(x)[11:20]
:也就是说,将x
转换为字符串(这是print x
显示的内容)并获取其中的11:20索引。 / p>
最好使用strftime
:x.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;"
,则可能需要执行更多字符串处理。