用 Python 复制 "tail -f"

Replicating "tail -f" with Python

根据 David Beazley's talk on generators,以下代码应复制 UNIX tail -f 命令:

import time
def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

f = open('followed.txt')
lines = follow(f)

for i in lines:
    print i

如果我 运行 在 shell 中执行此操作,它会执行 "something",并且确实会锁定 IPython 笔记本,但不会打印出followed.txt 的内容。为什么会这样?

follow() 生成器只会在调用 follow() 之后 写入文件的 return 行。 seek(0,2) 将光标放在文件的 end 处,然后尝试从该点开始读取新行。

tail 通常默认输出最后 10 行。如果你想要那样的东西

def follow(thefile):
    n_lines = 0
    # Seek to the end of the file
    thefile.seek(0,2)
    # Seek the cursor back one character at a time until you
    # reach the beginning of the file or 10 newlines are found.
    while n_lines < 10 and thefile.tell() > 0:
        # Go back one character and read it.
        thefile.seek(-1, 1)
        c = thefile.read(1)
        # Only go back 10 lines
        if c == '\n':
            n_lines += 1:
        # Reset the cursor position for the character we just read
        thefile.seek(-1, 1)

    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

我试过这个脚本,它有效。

您必须确保您的输入文件是一个不断增长的文件。如果不是,它就会挂起并等待新的增长行。

这是一个脚本,每 5 秒将带有时间戳的行写入 sample.csv。

import os
import time
import datetime

while True:
    os.system("echo " + "sample line with timestamp:{0}".format(datetime.datetime.now()) + " >> " + " sample.csv")
    time.sleep(5)

使用您的 tail -f 脚本阅读它,您将看到输出。