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

Python逐行追加文本到大文件避内存错误的高效替代方案

优化大TXT文件逐行追加前缀的高效方案

你的原始代码慢的核心原因有两个:一是用readlines()把整个大文件加载到内存,既占资源又拖慢速度;二是分两次打开文件(先读再写),增加了不必要的磁盘IO开销。下面是针对大文件优化后的方案,完全避免内存溢出,同时大幅提升处理速度:

优化后的代码

import os
from pathlib import Path

# 注意用原始字符串避免转义问题,或者用双引号加双反斜杠
cwd = r'C:\Users\EricClapton'
directory = Path(cwd)

# 遍历目录下所有txt文件
for txt_file in directory.glob('*.txt'):
    # 提取文件名前缀:取下划线前的第一部分(比如XXX_USR.txt -> XXX)
    file_prefix = txt_file.stem.split('_')[0]
    # 提前准备好要追加的前缀,避免循环内重复计算
    amend_prefix = f"| {file_prefix}"
    sys_prefix = "| SYS"
    
    # 创建临时文件(和原文件同目录,后缀为.tmp)
    temp_file = txt_file.with_suffix('.tmp')
    
    # 同时打开原文件(读)和临时文件(写),逐行处理
    with open(txt_file, 'r', errors='ignore') as infile, open(temp_file, 'w') as outfile:
        # 处理首行
        first_line = next(infile, '')
        if first_line:
            outfile.write(f"{sys_prefix}{first_line}")
            # 处理剩余所有行:迭代读取,内存占用极低
            for line in infile:
                outfile.write(f"{amend_prefix}{line}")
    
    # 原子替换原文件:处理完成后用临时文件覆盖原文件,避免中途出错损坏原文件
    os.replace(temp_file, txt_file)

关键优化点

  • 内存零压力:不再一次性加载整个文件,而是用迭代器逐行读取,内存占用始终保持在几行数据的大小,完全不会出现MEMORY ERROR。
  • 减少磁盘IO:一次性打开输入和输出文件,逐行处理并写入,避免了先读完整文件再写入的两次大IO操作,磁盘效率提升明显。
  • 安全可靠:使用临时文件中转,即使脚本中途崩溃,原文件也不会被破坏;最后用os.replace做原子替换,跨平台(Windows/Linux/macOS)都能保证文件替换的完整性。
  • 代码更简洁:用pathlib的API统一处理文件路径,前缀提取直接用split('_')[0]比原来的join更高效直观。
  • 字符串拼接优化:用f-string做字符串格式化,比传统的+拼接性能更好,代码也更易读。

额外建议

  • 如果你的磁盘IO是最大瓶颈,可以考虑用itertools.islice批量读取多行(比如一次读1000行),减少IO调用次数,但逐行处理已经足够应对绝大多数场景。
  • 可以添加异常捕获逻辑(比如try...except),处理临时文件创建失败、文件权限不足等情况,让脚本更健壮。
  • 注意路径的转义问题:原代码里的cwd = 'C:\Users\EricClapton\'会触发语法错误(末尾反斜杠转义了单引号),所以改成原始字符串r'路径'或者双引号包裹的"C:\\Users\\EricClapton"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:10:10