python 自动化运维之tail -f 实现
一、基础准备
(1)通过read方法传输参数,如read(3),当文件打开方式为文本模式时,代表读取3个字符,当文件打开方式为二进制模式时,代表读取3个字节。
(2)以字节为单位定位,如seek、tell等方法。其中seek有3种移动方式:0、1、2,其中1和2必须在二进制模式下进行,但无论哪种模式,都是以bytes为单位移动的。f.tell()返回文件对象当前所处的位置,它是从文件开头开始算起的字节数。如果要改变文件当前的位置,可以使用f.seek(offset, from_what)函数。from_what如果是0,则表示开头;如果是1,则表示当前位置;如果是2,则表示文件的结尾。例如:
seek(x,0) 表示从起始位置即文件首行首字符开始移动x个字符;
seek(x,1) 表示从当前位置向后移动x个字符;
seek(-x,2) 表示从文件的结尾向前移动x个字符
>>> f=open("tmp.txt","rb+") # 以二进制方式打开文件
>>> f.write(b"abxdefgh") # 写入文件
8
>>> f.seek(3) # 移动到文件的第四个字节
3
>>> print(f.read(1)) # 读取一个字节
b'd'
print(f.read(3))
二、基于seek实现类似Linux命令tail -f的功能;代码实现–哆啦A梦的任意门
tail -f
是不断地输出追加的日志,
import time
with open('tmp.txt','rb') as f: # 打开文件
f.seek(0,2) # 将光标移至文件末尾
while True: # 实时显示文件新增的内容
line=f.read() # 读取内容
if line:
print(line.decode("utf-8"),end='')
else:
time.sleep(0.2) #读取完毕短暂睡眠
# continue
当tmp.txt追加新的内容时,新内容会被程序立即打印出来。
效果如下:
$ echo 'sdaddasdasd' >> testDemo/tmp.txt # 向文件追加数据
$ python -u "d:\WorkSpace\python-WorkSpace\testD
emo\tailf.py"
sdad
sdad
sdad
sdad
sdad
sdad