如何在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
相关产品推荐
相关产品推荐

