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

