对于我的脚本,我需要使用只有标准库的Python 2.6。我正在尝试编写一个脚本,该脚本遍历一个日志目录,该目录的条件定义只匹配具有适当时间戳的日志。我使用的时间戳是从文件名派生的。我不想使用操作系统时间戳,因为有时文件会被复制到另一个目录以防止它们被覆盖,这会改变文件修改时间。
每200MB创建一个新文件。文件名的时间戳是文件创建的时间,表示文件中最旧的日志条目。
import datetime
# One event might span multiple log files.
call_start = datetime.datetime(2018, 5, 15, 5, 25, 9)
call_stop = datetime.datetime(2018, 5, 15, 5, 37, 38)
# Timestamp values of file generated from file's naming convention
t1 = datetime.datetime(2018, 5, 15, 4, 48, 16)
t2 = datetime.datetime(2018, 5, 15, 5, 3, 53)
t3 = datetime.datetime(2018, 5, 15, 5, 19, 14)
t4 = datetime.datetime(2018, 5, 15, 5, 35)
t5 = datetime.datetime(2018, 5, 15, 5, 49, 19)
file_times = [t1, t2, t3, t4, t5]
matching_times = []
for ftime in file_times:
# Logic I can't figure out
if scratches_head:
matching_times.append(ftime)
# I would expect the matching_times list to contain t3 and t4
修改
来自comments:
的澄清 t3
是在5:19:14am
创建的文件。 call_start
是我在日志中看到的第一个条目。它始于5:25:09am
。由于在t4
之前5:35:00am
尚未创建,call_start
必须位于t3
。 call_stop
是我想要查找的最后一个日志条目。我会在t4
,因为t5
是在5:49:19am
创建的。
答案 0 :(得分:1)
一种方法是enumerate()
覆盖列表中的项目,并从每对连续的时间创建范围。然后检查这些ranges overlap是否包含(call_start, call_end)
。如果范围重叠,请将范围的开头附加到列表中。您还必须在列表中最后一次包含特殊检查。
例如:
for i, ftime in enumerate(file_times):
if i+1 >= len(file_times):
# last item in list, add if it's less than call_stop
scratches_head = ftime < call_stop
else:
# check if ranges overlap
fstart = ftime
fend = file_times[i+1]
scratches_head = (fstart <= call_stop) and (fend >= call_start)
if scratches_head:
matching_times.append(ftime)
print([datetime.datetime.strftime(x, "%Y-%m-%d %H:%M:%S") for x in matching_times])
#['2018-05-15 05:19:14', '2018-05-15 05:35:00']