Я пытаюсь реализовать простой метод для чтения новых строк из файла журнала при каждом вызове метода.
Я просмотрел различные предложения как в stackoverflow (например, здесь) и в других местах для имитации «хвостовой» функциональности; в большинстве случаев используется readline()
для чтения новых строк по мере их добавления к файлу. Это должно быть достаточно просто, но не может заставить его работать должным образом в OS X 10.6.4 с включенным Python 2.6.1.
Чтобы добраться до сути проблемы, я попробовал следующее:
Откройте два окна терминала.
В одном создайте текстовый файл «test.log» с тремя строками:
one two three
В другом запустите python и выполните следующий код:
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.stat('test.log') posix.stat_result(st_mode=33188, st_ino=23465217, st_dev=234881025L, st_nlink=1, st_uid=666, st_gid=20, st_size=14, st_atime=1281782739, st_mtime=1281782738, st_ctime=1281782738) >>> log = open('test.log') >>> log.tell() 0 >>> log.seek(0,2) >>> log.tell() 14 >>>
Итак, с помощью
tell()
мы видим, чтоseek(0,2)
привело нас к концу файла, о чем сообщаетos.stat()
, байт 14.В первой оболочке добавьте еще две строки в «test.log», чтобы он выглядел так:
one two three four five
Вернитесь ко второй оболочке и выполните следующий код:
>>> os.stat('test.log') posix.stat_result(st_mode=33188, st_ino=23465260, st_dev=234881025L, st_nlink=1, st_uid=666, st_gid=20, st_size=24, st_atime=1281783089, st_mtime=1281783088, st_ctime=1281783088) >>> log.seek(0,2) >>> log.tell() 14 >>>
Здесь мы видим из os.stat()
, что размер файла теперь 24 байта, но поиск в конец файла каким-то образом все еще указывает на 14 байт?? Я пробовал то же самое на Ubuntu с Python 2.5, и он работает так, как я ожидаю. Я пробовал с 2.5 на своем Mac, но получил те же результаты, что и с 2.6.
Я должен упустить что-то фундаментальное здесь. Любые идеи?