如何在不加载整个文件的情况下读取dat文件最后N行并保存到数组
读取大文件最后N行并保存到数组(无需加载整个文件)
嘿,这个需求太实用了——处理大文件时最怕把整个文件塞进内存,咱们直接从文件末尾反向定位目标行,既高效又省资源!下面以Python为例,给你详细的实现方案:
核心思路
- 从文件末尾开始,逐步向前移动文件指针
- 统计遇到的换行符数量,直到找到
N个(或者到达文件开头) - 定位到最后N行的起始位置后,读取这部分内容并分割为数组
Python 实现代码
def get_last_n_lines(file_path, n): lines = [] with open(file_path, 'r') as f: # 先移动到文件末尾 f.seek(0, 2) file_size = f.tell() buffer = [] newline_count = 0 # 从末尾反向读取,每次读1字节 while f.tell() > 0 and newline_count < n: f.seek(f.tell() - 1) char = f.read(1) if char == '\n': newline_count += 1 # 收集到一个换行符,把buffer里的内容反转后加入临时列表 if buffer: lines.append(''.join(reversed(buffer))) buffer = [] else: buffer.append(char) # 处理文件开头到第一个换行符的内容(如果还有剩余) if buffer: lines.append(''.join(reversed(buffer))) # 因为是反向收集的,所以要再反转一次得到正确顺序 lines = lines[::-1] # 如果文件总行数小于n,直接返回所有行 return lines[:n] # 示例调用 file_path = "your_large_file.txt" n = 3 last_n_lines = get_last_n_lines(file_path, n) print(last_n_lines)
代码说明
f.seek(0, 2):将文件指针移动到文件末尾(参数2代表相对于文件末尾的位置)- 反向逐字节读取,统计换行符数量,这样能精准定位最后N行的起始点
- 用buffer临时存储反向读取的字符,遇到换行符就反转buffer得到完整的一行
- 最后再整体反转列表,恢复行的正确顺序
- 自动处理文件总行数小于N的情况,直接返回所有行
其他场景补充
如果是在Linux/macOS终端下快速处理,可以直接用tail命令:
# 读取最后3行并保存到数组(Bash示例) last_lines=($(tail -n 3 your_large_file.txt))
不过这种方式适合脚本场景,编程场景还是推荐上面的Python方法更灵活可控。
内容的提问来源于stack exchange,提问作者SKPS
相关产品推荐
相关产品推荐

