用 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
脚本阅读它,您将看到输出。
根据 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
脚本阅读它,您将看到输出。