Я пишу программу, которая будет анализировать файл журнала Apache периодически для входа, это - посетители, использование пропускной способности, и т.д.
Проблема, я не хочу открывать журнал и данные синтаксического анализа, которые я уже проанализировал. Например:
line1
line2
line3
Если я проанализирую тот файл, то я сохраню все строки, затем сохраняют то смещение. Тот путь, когда я анализирую его снова, я добираюсь:
line1
line2
line3 - The log will open from this point
line4
line5
Во второй раз вокруг, я получу line4 и line5. Надо надеяться, это имеет смысл...
То, что я должен знать, как я выполняю это? Python имеет искание () функция для определения смещения... Я просто получаю размер файла журнала (в байтах) после парсинга, он затем использует это в качестве смещения (в, ищут ()), во второй раз, когда я регистрирую его?
Я, может казаться, не думаю о способе кодировать это>. <
Вы можете управлять позицией в файле благодаря методам seek
и tell
класса file
см.
https://docs.python.org/2/tutorial/inputoutput.html
Метод tell
скажет вам, где искать в следующий раз, когда вы откроете
log = open('myfile.log')
pos = open('pos.dat','w')
print log.readline()
pos.write(str(f.tell())
log.close()
pos.close()
log = open('myfile.log')
pos = open('pos.dat')
log.seek(int(pos.readline()))
print log.readline()
Конечно, вы не должны использовать это так - вы должны обернуть операции в функции типа save_position(myfile)
и load_position(myfile)
, но функциональность вся на месте.
Если ваши лог-файлы легко умещаются в памяти (то есть, у вас разумная политика ротации), вы можете легко сделать что-то вроде:
log_lines = open('logfile','r').readlines()
last_line = get_last_lineprocessed() #From some persistent storage
last_line = parse_log(log_lines[last_line:])
store_last_lineprocessed(last_line)
Если вы не можете этого сделать, вы можете использовать что-то вроде (см. использование seek и tell в принятом ответе, если вам нужно сделать это с ними) Получить последние n строк файла с помощью Python, аналогично tail
Если вы разбираете журнал построчно, вы можете просто сохранить номер строки с последнего разбора. В следующий раз вам просто придется начинать читать его с хорошей строки.
Поиск более полезен, когда вам нужно попасть в очень конкретное место в файле.
Обратите внимание, что в python можно выполнить seek() из конца файла:
f.seek(-3, os.SEEK_END)
помещает позицию чтения в 3 строки от EOF.
Однако, почему бы не использовать diff, либо из оболочки, либо с помощью difflib?
Легко, но не рекомендуется :):
last_line_processed = get_last_line_processed()
with open('file.log') as log
for record_number, record in enumerate(log):
if record_number >= last_line_processed:
parse_log(record)
Вот проверка кода с использованием вашего предложения длины и метода сообщения:
beginning="""line1
line2
line3"""
end="""- The log will open from this point
line4
line5"""
openfile= open('log.txt','w')
openfile.write(beginning)
endstarts=openfile.tell()
openfile.close()
open('log.txt','a').write(end)
print open('log.txt').read()
print("\nAgain:")
end2 = open('log.txt','r')
end2.seek(len(beginning))
print end2.read() ## wrong by two too little because of magic newlines in Windows
end2.seek(endstarts)
print "\nOk in Windows also"
print end2.read()
end2.close()