小编给大家分享一下python实现tail - f功能的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
tailf与tail - f类似:当文件不增长时并不访问文件
tail - f:只跟踪文件内容
tail - f:文件内容与文件名都跟踪
这篇文章最初是因为重启的群里,有人去面试,笔试题有这个题,不知道怎么做,什么思路,就发群里大家讨论
我想了一下,简单说一下我的想法吧,当然,也有很好用的pyinotify模块专门监听文件变化,不过我更想介绍的,是解决的思路,毕竟作为面试官,还是想看到一下解决问题的思路,而且我觉得这一题的难点不在于监控文件增量,而在于怎么打印最后面10行
希望大家读这篇文章前,对python基础,处理文件和常用模块有一个简单的了解,知道下面几个名词是啥
开放(& # 39;a.txt& # 39;) file.seek file.tell time . sleep ()
下面思路限于我个人知识,免不了有错误和考虑不周的,希望大家有更好的方法提出来,我随时优化代码,题目的感觉没啥太多的坑,下面让天真烂漫的蜗牛教大家用python的思路
<强>怎么用python实现强>
其实思路也不难啦
- <李>
打开这个文件,指针移到最后
李> <李>每隔一秒就尝试readline一下,有内容就打印出来,没内容就睡眠
李> <李>大概就是这么个意思
李><强>监听文件强>
思路如下:
- <李>
用开放打开文件
李> <李>用寻求文件指针,给大爷把跳到文件最后面
李> <李>而真正进行循环
持续不停的readline,如果能读到内容,打印出来即可
代码呼之欲出
with 开放(& # 39;用法# 39;),as f: f.seek才能(0,2) while 才能正确的: ,,,last_pos =, f.tell () ,,,line =, f.readline () ,,,if 线: ,,,,,print 行
代码说明
- <李>
寻求第二个参数2,意思就是从文件结尾处开始,寻求更标准的写法使用os模块下面的SEEK_END,可读性更好
李> <李>只写出了简单的逻辑,代码简单粗暴,如果这个题目是10分的话,最多也就拿4分吧,不能再多了
李><>强优化点强>
- <李>
打印有缺陷,每次都是新的一行,换成sys.stdout.write(线)更和谐
李> <李>文件名传参,不能写死
李> <李>直接打印可以当成默认行为,具体要做什么,可以写成函数处理,这样我们就可以把新行做其他处理,比如展示在浏览器里
李> <李>加上容错处理,比如文件不存在会报错
李> <李>,而真正一直都文件,比较耗性能,每读一次,间隔一秒比较靠谱
李> <李>调用time . sleep (1)
李> <李>用类来组织代码
李>实例代码如下
# !/usr/bin/env python #,- *安康;编码:utf-8 - * import 系统 import 时间 class 尾(): def 才能__init__(自我、file_name调=sys.stdout.write): ,,,self.file_name =file_name ,,,self.callback =回调 def 才能;遵循(自我): ,,,试一试: ,,,,,with 开放(self.file_name), as f: ,,,,,,,f.seek (0, 2) ,,,,,,,while 正确的: ,,,,,,,,,line =, f.readline () ,,,,,,,,,if 线: ,,,,,,,,,,,self.callback(线) ,,,,,,,,,time . sleep (1) ,,,except 例外,e: ,,,,,print & # 39;打开文件失败,囧,看看文件是不是不存在,或者权限有问题& # 39; ,,,,,print e
使用方法:
#,使用默认的sys.stdout.write打印到屏幕 py_tail =,尾巴(& # 39;用法# 39;) py_tail.follow () #,自己定义处理函数 def test_tail(线): print 才能;& # 39;xx # 39; +线+ & # 39;xx # 39; py_tail1 =,尾巴(& # 39;用法# 39;,,test_tail) py_tail1.follow ()
咦等等,tail - f默认还会打印最后10行,这个好像才是这个题目的难点所,在众所周知,python里读文件指针,只能移动到固定位置,不能判断是哪一行,囧,先实现简单的,逐渐加强吧
默认打印最后10行
现在这个代码,大概能拿6分啦,我们还有一个功能没做,那就是打印最后n行,默认是10行,现在把这个功能加上,加一个函数就行啦
文件小的时候