2012-03-22 3 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 Я пытался использовать DateTime и функцию среза.

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

Просьба уточнить ваш вопрос. 'TypeError' является нормальным:' x' не является строкой, это объект datetime. Где трёхминутный интервал? Подсказка: вы должны ожидать найти 'datetime.timedelta' в своем коде, если имеете дело с интервалами. Где вы читаете файл журнала и сравниваете время? – Celada

ответ

2

Когда вы вызываете datetime.datetime.now(), python возвращает объект datetime, а не строку. Вот почему вы не можете взять кусочек из него напрямую. Когда вы вызываете print x, питон внутренне вызывает str(x), чтобы отформатировать его так, как вы видите. Итак, вам нужно a = str(x)[11:20].

Однако лучшим решением является использование datetime.strftime.

Как segue из datetime.strftime, если вы хотите получить объект datetime из вашего существующего файла журнала (чтобы проверить, было ли это время за последние 3 минуты), вы можете использовать datetime.strptime like так: datetime.strptime(line.split(';',1)[0],"%a %b %H:%M:%S %Y).

+0

Я считаю, что реальный вопрос на самом деле «как извлечь строки журнала за последние 3 минуты». – EOL

2

datetime.datetime объекты не поддерживают нарезку. Я думаю, что вы пытаетесь сделать это: str(x)[11:20]: т. Е. Конвертировать x в строку (это то, что показывают print x), и взять 11: 20 индексов этого.

Лучше, возможно, использовать 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;".

+0

С уважением – nosensus

+0

+1: Этот код выглядит идеально. :) – EOL

Смежные вопросы