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

如何使用Python高效实现大文件首行删除

Python 大文件高效删除首行实现

你参考的删除文件最后一行的方案之所以效率极高,是因为操作系统原生支持文件尾部截断操作,只需要从文件尾倒序找到最后一个换行符位置,直接截断后续内容即可,不需要改动文件其余部分,也不用全量加载文件。
但文件系统没有提供从文件头部截断的原生能力,无法直接抹除开头的首行内容让后续内容自动前移,因此零全量加载删除首行的核心逻辑如下:

  • 从文件开头正向查找第一个换行符的偏移位置,定位首行结束点
  • 按固定块大小读取首行之后的内容,逐块写回到文件开头位置,全程仅占用单块大小的内存,不会把整个文件加载到内存,内存占用和文件总大小无关
  • 所有内容前移完成后,截断文件尾部多余的长度即可

实现代码

import os
import sys

# 块大小可根据可用内存调整,数值越大IO次数越少、处理速度越快
BLOCK_SIZE = 1024 * 1024  # 默认单块1MB

with open(sys.argv[1], "r+", encoding="utf-8", newline="") as f:
    # 定位首行末尾的换行符位置
    f.seek(0, os.SEEK_SET)
    first_line_end_pos = 0
    while True:
        c = f.read(1)
        # 整个文件只有一行的情况,直接清空文件
        if not c:
            f.truncate(0)
            break
        first_line_end_pos += 1
        if c == "\n":
            break
    else:
        exit()

    # 首行之后无剩余内容的情况,直接清空文件
    f.seek(0, os.SEEK_END)
    total_size = f.tell()
    if first_line_end_pos >= total_size:
        f.truncate(0)
        exit()

    # 分块前移覆盖首行位置
    read_pos = first_line_end_pos
    write_pos = 0
    while read_pos < total_size:
        f.seek(read_pos, os.SEEK_SET)
        chunk = f.read(BLOCK_SIZE)
        f.seek(write_pos, os.SEEK_SET)
        f.write(chunk)
        read_pos += len(chunk)
        write_pos += len(chunk)

    # 截断尾部多余内容
    f.truncate(write_pos)

注意事项

  • 可以根据运行环境内存调整BLOCK_SIZE参数,设置为4MB、8MB甚至更大都可以,只要不超过可用内存即可,块越大处理速度越快
  • 打开文件时传入newline=""参数,是为了避免不同操作系统下换行符自动转换导致的位置计算错误
  • 建议处理重要文件前提前备份,避免程序中途意外中断损坏原文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:18:25