zoukankan      html  css  js  c++  java
  • python快速读取大文件的最后n行

    方法1 使用file.seek,从文件尾部指定字节读取(推荐):

    参考:Python read,readline,readlines和大文件读取

    def tail(filepath, n, block=-1024):
        with open(filepath, 'rb') as f:
            f.seek(0,2)
            filesize = f.tell()
            while True:
                if filesize >= abs(block):
                    f.seek(block, 2)
                    s = f.readlines()
                    if len(s) > n:
                        return s[-n:]
                        break
                    else:
                        block *= 2
                else:
                    block = -filesize
    
    
    if __name__ == '__main__':
        lines = tail('million_line_file.txt', 10)
        for line in lines:
            print(line)
    

    注意:只有用b二进制的方式打开文件,才可以从后往前读!!!seek()方法才能接受负数参数

    方法2 使用linecache:

    参考:Python读取大文件的最后N行

    import linecache
    
    # 放入缓存防止内存过载
    def get_line_count(filename):
        count = 0
        with open(filename, 'r') as f:
            while True:
                buffer = f.read(1024 * 1)
                if not buffer:
                    break
                count += buffer.count('
    ')
        return count
    
    
    if __name__ == '__main__':
        # 读取最后30行
        file = 'million_line_file.txt'
        n = 30
        linecache.clearcache()
        line_count = get_line_count(file)
        print('num: ', line_count)
        line_count = line_count - 29
        for i in range(n):
            last_line = linecache.getline(file, line_count)
            print(line_count, last_line)
            line_count += 1
    
    

    经测试,写入一个简单的一千万行的txt文件,在老的macbookpro上需要15-20秒,
    使用这个方法,读取这个文件最后30行,只需要5秒左右。

    未经作者允许,禁止转载
  • 相关阅读:
    xcode构建webdriverAgent时报错Messaging unqualified id的解决办法
    ubuntu18.0安装RabbitMQ
    python中*的用法
    Jenkins构建项目
    Jenkins安装与配置
    git_仓库
    六、 Shell数组应用
    五、 Shell函数应用
    三、 Shell流程控制
    二、 Shell变量定义
  • 原文地址:https://www.cnblogs.com/wangyangang/p/python-read-big-file-last-n-lines.html
Copyright © 2011-2022 走看看