You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中高效实现`tail -1`读取大文件最后一行

快速读取超大文件最后一行的Python原生实现

问题背景

你有超过1亿行的超大文件,目前通过调用外部/usr/bin/tail -1命令实现快速读取最后一行,但尝试Python原生seek方法时出现异常,无法得到正确结果2001098251。

问题分析

你之前的seek实现逻辑存在两处核心问题:

  • 逐字节倒序遍历效率极低,完全不适合超大文件
  • 每次readline()会从当前位置读到行尾,导致拼接或覆盖的结果不符合预期,甚至只捕获到空行就终止

正确的Python原生实现方案

我们可以借鉴tail命令的底层逻辑:从文件末尾开始按块反向读取,直到找到目标换行符,既保证效率又不会占用过多内存。

def get_last_line(file_path):
    block_size = 1024  # 每次读取的块大小,可根据文件行长度调整
    with open(file_path, 'rb') as f:
        # 定位到文件末尾,获取文件总大小
        f.seek(0, 2)
        file_size = f.tell()
        
        # 从文件末尾往前取一块内容开始查找
        start_pos = max(0, file_size - block_size)
        f.seek(start_pos)
        block = f.read()
        
        # 从块内反向查找最后一个换行符
        newline_idx = block.rfind(b'\n')
        last_line = block[newline_idx+1:].decode().strip() if newline_idx != -1 else block.decode().strip()
        
        # 处理文件末尾存在空行的情况,继续往前读取查找
        while last_line == '' and start_pos > 0:
            start_pos = max(0, start_pos - block_size)
            f.seek(start_pos)
            block = f.read(file_size - start_pos)
            newline_idx = block.rfind(b'\n')
            last_line = block[newline_idx+1:].decode().strip() if newline_idx != -1 else block.decode().strip()
        
        return last_line

# 使用示例
file = "./Python/nombres_premiers"
last_line = get_last_line(file)
print(last_line)  # 输出:2001098251

方案优势

  • 高效:按块反向读取,避免逐字节遍历,速度接近tail命令
  • 低内存占用:每次仅读取固定大小的块,不会加载整个文件
  • 鲁棒性:自动处理文件末尾空行、文件小于块大小等边界情况

内容的提问来源于stack exchange,提问作者Tawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:53:25