我可以以阻止方式使用file.readline吗?我这样做了吗?

时间:2011-08-31 16:50:27

标签: python

我正在尝试编写一个监视日志文件的内容,并在看到完整的行时添加时间戳:

import sys

f = open(sys.argv[1])
if not f:
    print 'Failed to open %s' % sys.argv[1]

print sys.argv[1]

import time

try:
    while True:
        line = f.readline().replace('\n', '')
        if not line:
            continue
        print time.time(), line
except KeyboardInterrupt:
    pass

f.close()

检查行内容是因为,令我惊讶的是,readlines不会阻塞,而是立即为文件末尾返回一个空字符串。

那么,为了监控文件,我有几个问题:有什么方法可以设置阻止吗?我在这个循环中看到空字符串,它们是否有可能实际上不代表行尾?仍然打开用于写入的文件是否添加了行尾字符?

2 个答案:

答案 0 :(得分:2)

  1. 使用os.path.getsize测试文件大小,以查看文件中是否存在差异
  2. f.readline仅在尺寸不同时
  3. 每次您首先阅读seek来电话,以确保您实际上正在阅读最后一行。
  4. 使用f.readline()[0:-1]删除尾随\n(感谢rm指出rstrip可能会导致您出现问题)
  5. 不是经常运行循环,而是每秒测试一次并使用sleep(相信我,你的电脑会感谢你)

答案 1 :(得分:1)

您可以使用子流程打开tail类似程序并读取其输出,该输出将阻止例如这是一个快速的python尾巴

import time
from subprocess import Popen, PIPE
file_path = '/home/auniyal/src/main/app.log'
p = Popen(['tail', '-f', file_path], stdout=PIPE)

while True:
    line = p.stdout.readline()
    print time.time(),"Wow",line