Python - Как я могу открыть файл и указать смещение в байтах?

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

Проблема, я не хочу открывать журнал и данные синтаксического анализа, которые я уже проанализировал. Например:

line1
line2
line3

Если я проанализирую тот файл, то я сохраню все строки, затем сохраняют то смещение. Тот путь, когда я анализирую его снова, я добираюсь:

line1
line2
line3 - The log will open from this point
line4
line5

Во второй раз вокруг, я получу line4 и line5. Надо надеяться, это имеет смысл...

То, что я должен знать, как я выполняю это? Python имеет искание () функция для определения смещения... Я просто получаю размер файла журнала (в байтах) после парсинга, он затем использует это в качестве смещения (в, ищут ()), во второй раз, когда я регистрирую его?

Я, может казаться, не думаю о способе кодировать это>. <

15
задан SilentGhost 21 July 2010 в 12:46
поделиться

7 ответов

Вы можете управлять позицией в файле благодаря методам seek и tell класса file см. https://docs.python.org/2/tutorial/inputoutput.html

Метод tell скажет вам, где искать в следующий раз, когда вы откроете

14
ответ дан 1 December 2019 в 03:51
поделиться
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), но функциональность вся на месте.

4
ответ дан 1 December 2019 в 03:51
поделиться

Если ваши лог-файлы легко умещаются в памяти (то есть, у вас разумная политика ротации), вы можете легко сделать что-то вроде:

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

1
ответ дан 1 December 2019 в 03:51
поделиться

Если вы разбираете журнал построчно, вы можете просто сохранить номер строки с последнего разбора. В следующий раз вам просто придется начинать читать его с хорошей строки.

Поиск более полезен, когда вам нужно попасть в очень конкретное место в файле.

0
ответ дан 1 December 2019 в 03:51
поделиться

Обратите внимание, что в python можно выполнить seek() из конца файла:

f.seek(-3, os.SEEK_END)

помещает позицию чтения в 3 строки от EOF.

Однако, почему бы не использовать diff, либо из оболочки, либо с помощью difflib?

0
ответ дан 1 December 2019 в 03:51
поделиться

Легко, но не рекомендуется :):

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)
0
ответ дан 1 December 2019 в 03:51
поделиться

Вот проверка кода с использованием вашего предложения длины и метода сообщения:

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()
0
ответ дан 1 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: