繁体   English   中英

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

[英]Can I use file.readline in a blocking manner? Am I doing this right?

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

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不会阻塞,而是立即为文件结尾返回一个空字符串。

因此,对于监视文件,我有几个问题:有什么方法可以将其设置为阻止? 我在此循环中看到空字符串,它们是否有可能实际上并不代表行尾? 仍处于打开状态以供写入的文件是否添加了行尾字符?

  1. 使用os.path.getsize测试文件大小,以查看文件中是否存在差异
  2. f.readline仅在大小上有差异时
  3. 每次阅读呼叫时,请先seek ,以确保您实际上正在阅读最后一行。
  4. 使用f.readline()[0:-1]消除尾随\\n (感谢rm指出rstrip可能会引起您的问题)
  5. 与其持续运行此循环,不如每秒测试一次并使用sleep (请相信我,您的计算机将感谢您)

您可以使用子进程打开像程序一样的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM