メソッドが呼び出されるたびにログファイルから新しい行を読み取る簡単なメソッドを実装しようとしています。
「テール」機能をシミュレートするためのstackoverflow(例:ここ)と他の場所の両方に関するさまざまな提案を見てきました。ほとんどreadline()
の場合、ファイルに追加される新しい行を読み取るためにを使用します。十分に単純なはずですが、付属のPython2.6.1を搭載したOSX10.6.4で正しく動作させることはできません。
問題の核心をつかむために、私は次のことを試みました。
2つのターミナルウィンドウを開きます。
1つでは、3行のテキストファイル「test.log」を作成します。
one two three
もう1つは、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 >>>
したがって、バイト14で報告されているように、ファイルの最後に到達した
tell()
ことがわかります。seek(0,2)
os.stat()
最初のシェルで、「test.log」にさらに2行追加して、次のようにします。
one two three four five
2番目のシェルに戻り、次のコードを実行します。
>>> 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を指していますか?私はPython2.5を搭載したUbuntuで同じことを試しましたが、期待どおりに機能します。Macで2.5を試してみましたが、2.6と同じ結果が得られました。
ここで基本的な何かが欠けているに違いありません。何か案は?