python如何从后往前读取文件?

小弟想在web上显示log文件的最新的五十条,遇到这个问题,希望大家帮帮忙。不甚感激。

阅读 10.9k
4 个回答

file.readlines()[-50:]

几种方式:

  1. 用subprocess调tail -f

  2. pyinotiy监听文件变化

  3. 自己实现,比如先拿到文件大小,读到最后一个字节,然后往回退到第一个n,这就是倒数第一行了,然后依次往回退

楼上几位说的都可行, 不过 @nealnote 的方法如果读大文件会有性能问题, 建议用 @manong 所说, subprocessunix系统自带的一个tail程序去做, 具体实现如下:

import subprocess


fh = subprocess.Popen("tail -n 50 /var/log/dmesg", stdout=subprocess.PIPE, shell=True)
for line in fh.stdout.readlines():
    print(line.decode('ascii'), end="")

运行结果:

...
...
rdac: device handler registered
device-mapper: multipath round-robin: version 1.0.0 loaded
EXT4-fs (sdd5): mounted filesystem with ordered data mode. Opts: 
EXT4-fs (sdd2): mounted filesystem with ordered data mode. Opts: 
EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: 
EXT4-fs (dm-0): warning: maximal mount count reached, running e2fsck is recommended
EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: 
Adding 1023996k swap on /dev/sdd3.  Priority:-1 extents:1 across:1023996k 

https://codeplot.top/index.ph... 1. 使用os.path.getsize 获取文件大小

  1. 使用 file_obj.seek 移动文件指针到文件末尾减一处
  2. 每次读取一个字符,并将文件指针向前移动一
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
def tail_read(f, n):
    cur_pos = f.tell()
    buf = b''
    while n:
        b = f.read(1)
        buf = b + buf
        cur_pos -= 1
        if cur_pos < 0: break
        f.seek(cur_pos)
        n -= 1
    return buf
def tail_open(file):
    fsize = os.path.getsize(file)
    f = open(file, 'rb')
    f.seek(fsize - 1)
    return f
if __name__ == '__main__':
    import sys
    f = tail_open(sys.argv[1])
    buf = tail_read(f, int(sys.argv[2]))
    print (buf)

原文地址

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题