Способ извлечь формат datetime.now из строки?

1

У меня есть файл журнала, который содержит строки, такие как

### 192.168.70.10 on 2018-06-19 23:57:37.846200 ###

### 192.168.70.11 on 2018-06-19 23:50:33.073267 ###

Он также может содержать другие данные по разным строкам.

Я хочу напечатать все строки, начинающиеся С###, и извлечь их дату/время, чтобы я мог сравнить их с другой датой/временем.

Как я могу это сделать? Должен ли я использовать Regex?

Вот пример того, что я делаю...

try:
    with open('myfile.log', 'r') as myfile:
        for line in myfile:
            if "###" in line:
                x = line

            print(x)
            # get date and time from x

    myfile.close
except OSError as e:
    print (e)
Теги:

3 ответа

1

Вы можете использовать регулярное выражение и проанализировать захваченную группу с помощью datetime.striptime

Это позволит вам редактировать регулярное выражение для соответствия 1 или нескольким пробелам и т.д.

from datetime import datetime
import re

with open('myfile.log') as myfile:
    for line in myfile:
        # Adding the ### into the regex allows you to remove the conditional if ### in line
        regex = r'###\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.+(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{0,})\s###'
        r = re.match(regex, line)
        if r:  # If there is a matching group, return matching group 1
            dt = datetime.striptime(r.group(1), "%Y-%m-%d %H:%M:%S.%f")

        print(dt)
  • 0
    Я бы предпочел назвать группу в регулярном выражении r"…(?P<dt>...)…" а затем ссылаться на нее по имени, а не по смещению: r.group("dt") . Я думаю, что это немного легче читать и поддерживать.
  • 0
    Наименование группы, безусловно, полезно. Но когда есть только одна группа, смещение легко запомнить. И присвоение имени группе для кого-то, кто не понимает регулярное выражение, просто усложняет его понимание.
1

Вы можете использовать регулярное выражение в этом типе проблем

try:
  with open('myfile.log', 'r') as myfile:
    reg = re.compile('^###.*on\s([\w\s.:-]*)')
    for line in myfile:
       m = reg.match(line)
       if m:
         datetime.striptime(m.group(1), "%Y-%m-%d %H:%M:%S.%f")
  • 0
    Пожалуйста, исправьте отступ и ваш код. Кроме того, для повышения производительности рассмотрите возможность компиляции регулярного выражения перед циклом, а затем используйте скомпилированный объект для сопоставления строки. Также помните, что search () может возвращать None , так что это тоже нужно проверить.
0

Предполагая, что строка всегда имеет фиксированный формат, тогда это должно работать:

# Extract the date and time substring.
s = x[-30:-4]

# Parse the string into a datetime object.
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S.%f")

Подробную информацию о строке шаблона см. В документации по strptime().

Если формат строки в вашем лог файле меняется, тогда может работать регулярное выражение (см. Ответ Дэниелса) или рассмотреть корректный синтаксический анализ строки.

  • 0
    Я получаю ValueError: данные времени '018-06-20 09: 12: 30.360350' не соответствуют формату '% Y-% m-% d% H:% M:% S:% f'
  • 0
    Да, ваша строка даты журнала пропускает 2 в начале, и ваша строка шаблона содержит :%f вместо .%f

Ещё вопросы

Сообщество Overcoder
Наверх
Меню