如何从文件的底行开始打印第三行?

时间:2018-07-03 15:03:13

标签: python python-2.7

我想从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()

1 个答案:

答案 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)]