Захватите последнюю метку времени, не читая весь файл, используя Python - PullRequest
0 голосов
/ 08 апреля 2020

Я довольно новичок в python, и я пытаюсь захватить последнюю строку в файле системного журнала, используя python, но не могу этого сделать. Это огромный файл журнала, поэтому я хочу избежать загрузки всего файла в память. Я просто хочу прочитать последнюю строку файла и записать временную метку для дальнейшего анализа.

У меня есть код ниже, который записывает все временные метки в python диктовку, которая требует действительно много времени для запуска чтобы добраться до последней отметки времени после ее завершения, мой план состоял в том, чтобы перевернуть список и захватить первый объект в индексе [0]:

Функция lastFile использует модуль glob и выдает мне самое последнее имя файла журнала который подается в недавнее редактирование основной функции.

Есть ли лучший способ сделать это

Script1:

#!/usr/bin/python
import glob
import os
import re

def main():
    syslogDir = (r'Location/*')
    listOfFiles = glob.glob(syslogDir)
    recentEdit  = lastFile(syslogDir)
    print(recentEdit)
    astack=[]
    with open(recentEdit, "r") as f:
        for line in f:
            result = [re.findall(r'\d{4}.\d{2}.\d{2}T\d{2}.\d{2}.\d{2}.\d+.\d{2}.\d{2}',line)]
            print(result)

def lastFile(i):
    listOfFiles = glob.glob(i)
    latestFile = max(listOfFiles, key=os.path.getctime)
    return(latestFile)



if __name__ == '__main__': main()

Script2:
###############################################################################
###############################################################################
#The readline() gives me the first line of the log file which is also not what I am looking for:



#!/usr/bin/python
import glob
import os
import re

def main():
    syslogDir = (r'Location/*')
    listOfFiles = glob.glob(syslogDir)
    recentEdit  = lastFile(syslogDir)
    print(recentEdit)
    with open(recentEdit, "r") as f:
        fLastLine = f.readline()
        print(fLastLine)
#    astack=[]
#    with open(recentEdit, "r") as f:
#        for line in f:
#            result = [re.findall(r'\d{4}.\d{2}.\d{2}T\d{2}.\d{2}.\d{2}.\d+.\d{2}.\d{2}',line)]
#            print(result)

def lastFile(i):
    listOfFiles = glob.glob(i)
    latestFile = max(listOfFiles, key=os.path.getctime)
    return(latestFile)



if __name__ == '__main__': main()

Я действительно ценю вашу помощь !!

С уважением.

1 Ответ

0 голосов
/ 09 апреля 2020

Если вы хотите напрямую go, до конца файла. Выполните следующие действия:

1. Каждый раз, когда ваша программа запускается, сохраняйте или сохраняйте последний индекс '\ n'.

2. Если вы сохранили индекс последнего '\ n', то вы можете непосредственно ищите этот индекс, используя

file.seek(yourpersistedindex)

3.a после этого, когда вы позвоните file.readline(), вы получите строки, начинающиеся с вашегоpersistedindex.

4. Сохраняйте этот индекс каждый раз, когда вы запускаете ваш script.

Например: ваш файл log.txt содержит содержимое, например:

timestamp1 \ n timestamp2 \ n timestamp3 \ n

import pickle
lastNewLineIndex = None
#here trying to read the lastNewLineIndex
try:
    rfile = open('pickledfile', 'rb')      
    lastNewLineIndex = pickle.load(rfile)
    rfile.close()
except:
    pass

logfile = open('log.txt','r')
newLastNewLineIndex = None
if lastNewLineIndex:
    #seek(index) will take filepointer to the index
    logfile.seek(lastNewLineIndex)
    #will read the line starting from the index we provided in seek function
    lastLine = logfile.readline()
    print(lastLine)
    #tell() gives you the current index
    newLastNewLineIndex = logfile.tell()
    logfile.close()
else:
    counter = 0
    text = logfile.read()
    for c in text:
        if c == '\n':
            newLastNewLineIndex = counter
        counter+=1


#here saving the new LastNewLineIndex
wfile = open('pickledfile', 'wb')
pickle.dump(newLastNewLineIndex,wfile)
wfile.close()
...