время и дата в языке Python - PullRequest
0 голосов
/ 22 марта 2012

У меня есть файл журнала

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]

... TypeError: объект datetime.datetime неподписан ... Я знаю, что алгоритм должен работать хорошо: текущее время занимает три минуты, но у меня нет никаких идей ... а скорее недостаток знаний

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

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;".

2 голосов
/ 22 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...