我有一个日志文件,其中包含诸如
### 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)
答案 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字符串。