Python文件句柄泄漏主因是打开后未关闭,导致“Too many open files”错误;常见于遗漏close()、异常中断执行流、多文件操作中清理失败及提前退出;推荐统一使用with语句确保自动关闭。

Python 文件句柄泄漏通常是因为打开文件后未正确关闭,导致操作系统持有的文件描述符无法释放。只要进程还在运行,这些未关闭的句柄就会持续占用系统资源,最终可能触发“Too many open files”错误。
忘记调用 close() 是最常见原因
直接使用 open() 打开文件,但没配对调用 close(),句柄就一直挂着:
-
f = open('data.txt'); content = f.read()—— 后面忘了f.close() - 即使加了
try...finally,但如果在open()后立刻抛异常(比如路径不存在),f可能根本没成功赋值,finally里又没做判空,反而引发新错误
异常打断正常执行流,跳过了关闭逻辑
在处理多个文件或嵌套操作时,中间某步出错,后续的 close() 就不会执行:
-
f1 = open('a.txt'); f2 = open('b.txt'); process(f1, f2); f1.close(); f2.close()—— 如果process()抛异常,两者的close()都被跳过 - 用
return、break或sys.exit()提前退出函数,也容易绕过清理代码
循环中反复打开却未及时关闭
在 for 循环或 while 中不断 open(),尤其配合条件判断或 continue,极易遗漏关闭:
立即学习“Python免费学习笔记(深入)”;
for name in filenames: f = open(name); do_something(f); # 忘了 close- 或在 if 分支里打开文件,但只在某个分支里 close,其他路径就漏掉了
推荐做法:始终用 with 语句
它能确保无论是否发生异常、是否提前返回,文件都会被自动关闭:
-
with open('data.txt') as f: content = f.read()—— 缩进结束即关闭 - 多个文件可写成
with open('a') as a, open('b') as b: - 若需手动控制生命周期(如长期缓存文件句柄),务必用
try/finally并检查对象是否存在
不复杂但容易忽略:句柄泄漏往往不是大段代码的问题,而是某一行少写了 close,或一个异常路径没覆盖到。










