有没有办法从 python 中两个端点之间的日志文件打印数据
Is there a way to print data from a log file between two endpoints in python
我有一个日志文件,正在尝试打印两个日期之间的数据。
2020-01-31T20:12:38.1234Z, asdasdasdasdasdasd,...\n
2020-01-31T20:12:39.1234Z, abcdef,...\n
2020-01-31T20:12:40.1234Z, ghikjl,...\n
2020-01-31T20:12:41.1234Z, mnopqrstuv,...\n
2020-01-31T20:12:42.1234Z, wxyzdsasad,...\n
这是示例日志文件,我想打印 2020-01-31T20:12:39 到 2020-01-31T20:12:41 之间的行。
到目前为止,我已经设法找到并打印了开始日期行。我已将开始日期作为开始。
with open("logfile.log") as myFile:
for line in myFile:
linenum += 1
if line.find(start) != -1:
print("Line " + str(linenum) + ": " + line.rstrip('\n'))
但是我如何一直打印到结束日期?
不是 python 中的答案,而是 bash 中的答案。
sed -n '/2020-01-31T20:12:38.1234Z/,/2020-01-31T20:12:41.1234Z/p' file.log
输出:
2020-01-31T20:12:38.1234Z, asdasdasdasdasdasd,...\n
2020-01-31T20:12:39.1234Z, abcdef,...\n
2020-01-31T20:12:40.1234Z, ghikjl,...\n
2020-01-31T20:12:41.1234Z, mnopqrstuv,...\n
如果你想在 python,
import time
from datetime import datetime as dt
def to_timestamp(date,forma='%Y-%m-%dT%H:%M:%S'):
return time.mktime(dt.strptime(date,forma).timetuple())
start=to_timestamp(startdate)
end=to_timestamp(enddate)
logs={}
with open("logfile.log") as f:
for line in f:
date=line.split(', ')[0].split('.')[0]
logline=line.split(', ')[1].strip('\n')
if to_timestamp(date)>=start and to_timestamp(end) <= end:
logs[date]=logline
由于时间字符串已经在您的文件中进行了很好的结构化处理,因此您只需在感兴趣的时间之间进行简单的字符串比较,而无需将字符串转换为日期时间对象。
使用csv
模块读入文件,使用默认的逗号分隔符,然后filter()
函数在两个日期之间进行过滤
import csv
reader = csv.reader(open("logfile.log"))
filtered = filter(lambda p: p[0].split('.')[0] >= '2020-01-31T20:12:39' and p[0].split('.')[0] <= '2020-01-31T20:12:41', reader)
for l in filtered:
print(','.join(l))
编辑:
我使用 split()
删除字符串比较中时间字符串的小数部分,因为您对时间最接近的分钟精度感兴趣,例如2020-01-31T20:12:39.
我有一个日志文件,正在尝试打印两个日期之间的数据。
2020-01-31T20:12:38.1234Z, asdasdasdasdasdasd,...\n
2020-01-31T20:12:39.1234Z, abcdef,...\n
2020-01-31T20:12:40.1234Z, ghikjl,...\n
2020-01-31T20:12:41.1234Z, mnopqrstuv,...\n
2020-01-31T20:12:42.1234Z, wxyzdsasad,...\n
这是示例日志文件,我想打印 2020-01-31T20:12:39 到 2020-01-31T20:12:41 之间的行。
到目前为止,我已经设法找到并打印了开始日期行。我已将开始日期作为开始。
with open("logfile.log") as myFile:
for line in myFile:
linenum += 1
if line.find(start) != -1:
print("Line " + str(linenum) + ": " + line.rstrip('\n'))
但是我如何一直打印到结束日期?
不是 python 中的答案,而是 bash 中的答案。
sed -n '/2020-01-31T20:12:38.1234Z/,/2020-01-31T20:12:41.1234Z/p' file.log
输出:
2020-01-31T20:12:38.1234Z, asdasdasdasdasdasd,...\n
2020-01-31T20:12:39.1234Z, abcdef,...\n
2020-01-31T20:12:40.1234Z, ghikjl,...\n
2020-01-31T20:12:41.1234Z, mnopqrstuv,...\n
如果你想在 python,
import time
from datetime import datetime as dt
def to_timestamp(date,forma='%Y-%m-%dT%H:%M:%S'):
return time.mktime(dt.strptime(date,forma).timetuple())
start=to_timestamp(startdate)
end=to_timestamp(enddate)
logs={}
with open("logfile.log") as f:
for line in f:
date=line.split(', ')[0].split('.')[0]
logline=line.split(', ')[1].strip('\n')
if to_timestamp(date)>=start and to_timestamp(end) <= end:
logs[date]=logline
由于时间字符串已经在您的文件中进行了很好的结构化处理,因此您只需在感兴趣的时间之间进行简单的字符串比较,而无需将字符串转换为日期时间对象。
使用csv
模块读入文件,使用默认的逗号分隔符,然后filter()
函数在两个日期之间进行过滤
import csv
reader = csv.reader(open("logfile.log"))
filtered = filter(lambda p: p[0].split('.')[0] >= '2020-01-31T20:12:39' and p[0].split('.')[0] <= '2020-01-31T20:12:41', reader)
for l in filtered:
print(','.join(l))
编辑:
我使用 split()
删除字符串比较中时间字符串的小数部分,因为您对时间最接近的分钟精度感兴趣,例如2020-01-31T20:12:39.