我想从date.log的最后一行读取并打印第3条。这是在line_from_bottom_line变量中指定的。 日志随时可以有任意行。
以下是该日志的示例:
192.168.80.231 May 8 2018 18:45:00
192.168.80.231 July 30 2018 09:46:48
192.168.80.231 July 2 2018 14:37:14
如果日志中只有3行,则将打印else行:
line_number[x1] = [(index,log_time)]
输出将是:
(1, '18:45:00')
那不是我想要的。
如果有4行或更多行,则打印的行将采用以下格式:
2018:8:18:45:00
这就是我想要的。
我认为我下面的代码移至最底行并减去3。因此,如果不存在4行,则不知道 打印什么。我如何更改它,以便即使没有4个或更多,也要打印从底部开始的第3个 日志中的行?
old_time = (line_number[x1][-(line_from_bottom_line)].__str__())
from datetime import datetime, date, time
# this would be the third from last line
line_from_bottom_line = 3
date_order = 2
time_order = 4
year_order = 3
present = datetime.now()
def main():
logfile = open('krinkov.log', 'r+')
line_number = dict()
for index,line in enumerate(logfile,1): # scan lines
if line in ['\n', '\r\n']: # Error Checking: if not enough lines in var .log
print("Not enough lines.")
return
if line:
x1 = line.split()[0] # if line, get IP address
log_day = line.split()[date_order]
log_time = line.split()[time_order] # This will already be in the format of hh:mm:ss
log_year = line.split()[year_order]
if x1 in line_number : # if ip address on line
line_number[x1].append((log_year + ":" + log_day + ":" + log_time))
else:
line_number[x1] = [(index,log_time)]
if x1 in line_number and len(line_number.get(x1,None)) > 1:
# Below is where I am having issues.
# If there are not 4 or more lines in the log, an error occurs.
old_time = (line_number[x1][-line_from_bottom_line])
print(old_time)
# ** get last line number. Print that line number. then subtract 2 from it
# old_time = that new number
else:
print('Nothing')
main()
答案 0 :(得分:1)
问题:查看将新元素添加到line_number
字典中的位置:
if x1 in line_number : # if ip address on line
line_number[x1].append((log_year + ":" + log_day + ":" + log_time))
else:
line_number[x1] = [(index,log_time)]
如果字典还不还包含IP地址(即else
部分已执行),则使用字典创建IP字段,该字典包含包含元素{{1 }},它是一个包含两个元素的元组。
此后,如果IP地址已经包含((index,log_time)
部分已执行),则只需添加if
,即 string (log_year + ":" + log_day + ":" + log_time)
。这是因为Python中的log_year + ":" + log_day + ":" + log_time
被解压缩到(elem)
中。如果要创建包含单个元素的元组,则必须编写elem
。
考虑到这一点,看来(elem,)
词典中的每个值都看起来像这样(请检查此!):
line_number
修复:将上面摘录中的[(1, '18:45:00'), "2018:8:18:45:00", "2018:8:18:45:00", "2018:8:18:45:00" ... ]
更改为[(index,log_time)]
应该可以解决您的问题。但是,这是不好的编码风格,因为您要写两次相同的东西。更好的解决方案是将以下代码替换为以下代码:
[(log_year + ":" + log_day + ":" + log_time)]