2012-03-22 53 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