Python读取文件最末N行,实现Linux的tail命令功能

19人阅读 评论(0) 收藏 举报

原文地址:http://shajunxing.tpddns.cn:8888/web/blog/2018-04-17-Python读取文件最末N行,实现Linux的tail命令功能/index.html

思路

主要使用fseek()函数的随机读写能力,从文件末尾按子节反向读取,遇到CR、LF作相应的处理。因为操作系统有缓存优化,所以这种方式的性能应该没问题,另外我看过tail的源代码,用的是lseek()函数,其实和fseek()是一样的。

另外要注意的是,涉及到编码问题,文件的应该用二进制方式读取,每一行读出之后再解码。

代码

def tail(file_name, line_count=10, encoding='utf-8'):
    """
    读取某文本文件最末的行
    :param file_name: 文件名
    :param line_count: 读多少行
    :param encoding: 文件编码
    :return: 数组格式的行列表
    """
    f = open(file_name, mode='rb')
    f.seek(0, io.SEEK_END)
    file_size = f.tell()
    if file_size == 0 or line_count <= 0:
        return []
    lines = []
    prev_char = None
    curr_line = bytearray()
    chars_read = 0
    f.seek(-1, io.SEEK_END)
    while True:
        curr_char = f.read(1)
        chars_read += 1
        # 以下三个步骤:增加字符、增加行、跳出循环,如果文件已经读完,则都要做
        if curr_char not in (b'\n', b'\r') or chars_read == file_size:
            curr_line.extend(curr_char)
        if curr_char == b'\n' or (curr_char == b'\r' and not prev_char == b'\n') or chars_read == file_size:
            curr_line.reverse()
            lines.append(bytes(curr_line).decode(encoding))
            curr_line.clear()
        if len(lines) == line_count or chars_read == file_size:
            break
        # 前退一个字节,此处可以测试一下性能
        f.seek(-2, io.SEEK_CUR)
        prev_char = curr_char
    lines.reverse()
    return lines
查看评论

C语言实现linux下的tail -n <n> 命令

linux下的tail -n 命令的作用就是输出文本文件的最后n行,如果文件的总行数小于n,则输出文件的所用行。 其通过C语言的fseek的实现方法如下: #include ...
  • littlefishzhang
  • littlefishzhang
  • 2012-05-12 15:25:38
  • 3462

linux tail命令显示最后n行

linux tail命令显示最后n行
  • yuxiangaaaaa
  • yuxiangaaaaa
  • 2017-06-05 17:10:59
  • 9519

python实现tail -f命令功能

#!/usr/bin/env python #!encoding:utf-8 ''' Python-Tail - Unix tail follow implementation in Python. ...
  • five3
  • five3
  • 2014-08-12 19:21:56
  • 8955

python实现tail命令,包含-f -n参数

# -*- coding: utf-8 -*- import sys import time def printlines(lines,line_start=0):     if len(li...
  • love_chivas
  • love_chivas
  • 2014-06-18 01:23:37
  • 2585

head和tail命令-----得到头尾N行或者这去掉尾头N/N-1行

[algo@localhost tmp]$ cat test  1 2 3 4 5 head得到头部2行,删掉尾部2行 [algo@localhost tmp]$ head -n...
  • crazyhacking
  • crazyhacking
  • 2014-01-10 15:30:26
  • 13922

Java实现linux的“tail -f”命令

两种方式,可以实现linux的“tail -f”命令。 1、FileInputStream在读取文件内容的时候,其他外部工具(如记事本、notepad++等)可以同时进行写入,且写入内容能继续读取到。...
  • xxgwo
  • xxgwo
  • 2016-04-20 09:46:49
  • 3498

Python自定制tail命令,tail -f 功能小解

因为做Java后端的,所以总需要查看log日志,我不知道别人有啥好的方法查看,我是使用tail -100f   ./xxxx.log,调用接口然后赶紧在shell中Ctrl+c,然后在翻过去找,觉得有...
  • chenjafo
  • chenjafo
  • 2017-07-02 01:10:12
  • 599

Linux的tail 与head 命令

head命令是用来查看具体文件的前面几行的内容,具体格式如下:head :你可以通过head命令查看具体文件最初的几行内容,该命令默认是前10行内容,如果你想查看前面更多内容,你可以通过一个数字选项来...
  • carolzhang8406
  • carolzhang8406
  • 2011-01-02 18:09:00
  • 15088

数据选取 (head 取出前面几行) (tail 取出后面几行)

说明有时候查看文件内容的时候,我们只需要简单的查看下文件内容,比如只需要查看前几行或者后面几行时,就可以使用这两个命令。head 取出前面几行命令说明[wenjie@localhost ~]$ hea...
  • u010010725
  • u010010725
  • 2016-09-09 13:39:30
  • 333

catalina.out文件最后n行输出到文件

查看Tomcat的logs目录下catalina.out文件,如果catalina.out文件过大,将其最后n行输出到指定的文件中,下载该文件查看。...
  • confili
  • confili
  • 2017-03-29 14:40:14
  • 1553
    个人资料
    等级:
    访问量: 5万+
    积分: 1086
    排名: 4万+
    最新评论