一种从行中提取datetime.now格式的方法?

时间:2018-06-20 05:38:47

标签: python

我有一个日志文件,其中包含诸如

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

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

它也可能在不同的行上包含其他数据。

我要打印以###开头的所有行并提取其日期/时间,以便可以将它们与另一个日期/时间进行比较。

我该怎么做?我应该使用正则表达式吗?

这是我在做什么的一个例子...

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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")

答案 2 :(得分: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() documentation

如果日志文件中行的格式不同,则regex可能有效(请参阅Daniel’s answer),或适当地考虑parsing字符串。