博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 实时遍历日志文件
阅读量:4696 次
发布时间:2019-06-09

本文共 1193 字,大约阅读时间需要 3 分钟。

推荐日志处理项目:

 

首先尝试使用 python open 遍历一个大日志文件,

使用 readlines() 还是 readline() ?

总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面。

但是 readlines() 会一次性把全部数据读到内存中,内存占用率会过高,readline() 每次只读一行,对于读取 大文件, 需要做出取舍。

如果不需要使用 seek() 定位偏移, for line in open('file') 速度更佳。

 

使用 readlines(),适合量级较小的日志文件

1 p = 0 2 with open(filepath, 'r+') as f: 3     f.seek(p, 0) 4     while True: 5         lines = f.readlines() 6         if lines: 7             print lines 8             p = f.tell() 9             f.seek(p, 0)10         time.sleep(1)

 

使用 readline(),避免内存占用率过大

1 p = 02 with open('logs.txt', 'r+') as f:3     while True:4         line = f.readline()5         if line:6             print line

 

################## 华丽分割 ##########################

现在尝试使用 tail -F log.txt 动态输出

由于 os.system() , commands.getstatusoutput() 属于一次性执行就拜拜, 最终选择 subprocess.Popen(),

subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen,使用Popen可以创建进程,并与进程进行交互。

1 import subprocess2 import time3 4 p = subprocess.Popen('tail -F log.txt', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,)5 while True:6    line = p.stdout.readline()7    if line:8         print line

转载于:https://www.cnblogs.com/sea520/p/10807509.html

你可能感兴趣的文章
QUIC:基于udp的传输新技术
查看>>
java常见面试题及部分答案
查看>>
【HTML代码】访问页面时,拨打页面中的电话号码
查看>>
重构的步骤
查看>>
动态添加方法的代码分析
查看>>
REDIS 安装
查看>>
thinkPHP5.0使用模型新增数据
查看>>
第二次ScrumMeeting
查看>>
微信二次分享功能开发笔记
查看>>
SQL 优化
查看>>
客户端第一天学习的相关知识
查看>>
python工具pycharm使用-断点调试
查看>>
Linux防火墙的关闭和开启
查看>>
LeetCode - Same Tree
查看>>
Python dict get items pop update
查看>>
[置顶] 程序员必知(二):位图(bitmap)
查看>>
130242014036-(2)-体验敏捷开发
查看>>
constexpr
查看>>
Nginx 流量和连接数限制
查看>>
课堂作业1
查看>>