Как напечатать 3-ую из нижней строки в файле? - PullRequest
0 голосов
/ 03 июля 2018

Я хочу прочитать и напечатать 3-ю из последней строки в date.log. Это указывается в переменной 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 или больше строки в журнале?

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 голосов
/ 03 июля 2018

Проблема: Посмотрите, где вы добавляете новые элементы в ваш 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 со словарем, содержащим список с элементом (index,log_time), который кортеж с двумя элементами.

После этого, если IP-адрес уже содержится (выполняется часть if), вы добавляете только (log_year + ":" + log_day + ":" + log_time), то есть строку log_year + ":" + log_day + ":" + log_time. Это потому, что (elem) в Python распаковывается в 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)] должно решить вашу проблему. Это плохой стиль кодирования, потому что вы пишете одно и то же дважды. Лучшим решением было бы заменить приведенный выше код следующей строкой:

line_number[x1] = line_number.get(x1, []) + [f"{log_year}:{log_day}:{log_time}"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...