应捕获 FileNotFoundError 异常而非前置检查,因存在竞态;优先用 pathlib.Path.unlink(missing_ok=True) 实现安全删除,语义清晰且一行解决。

os.remove() 删除文件时抛出 FileNotFoundError 怎么办
直接调用 os.remove() 删除不存在的文件会炸,不是静默跳过——这是最常踩的坑。它只做“删”,不做“查”。
- 必须先用
os.path.exists()或pathlib.Path.exists()判断文件是否存在 - 更稳妥的做法是捕获异常:用
try/except FileNotFoundError包住os.remove(),而不是靠前置检查(因为存在竞态:检查完、删除前文件被别的进程删了) - 别用
os.path.isfile()单独判断再删——如果路径是目录,os.remove()会报IsADirectoryError,和FileNotFoundError是不同异常,得分开处理
想删文件但不确定是不是符号链接,会影响吗
不影响。os.remove() 删除的是符号链接本身,不是它指向的目标。这点和 rm 命令默认行为一致。
- 如果要删目标文件(即“解引用后删除”),得先用
os.path.realpath()获取真实路径,再删 - 但注意:
os.remove()对软链目标没权限?那删软链本身仍可能成功;删目标则会因权限失败 - 符号链接 + 目标不存在 → 删软链成功;删目标则抛
FileNotFoundError
os.remove() 和 pathlib.Path.unlink() 选哪个
优先用 pathlib.Path.unlink(),语义更清晰,API 更现代,且默认支持 missing_ok=True 参数。
-
pathlib.Path("x.txt").unlink(missing_ok=True)—— 不存在也不报错,一行搞定安全删除 -
os.remove()没这个参数,必须手动包try/except或检查 - 性能差异可忽略;Python 3.6+ 都可用
pathlib;Windows/Linux 行为一致 - 如果项目还跑在 Python os.remove() + 异常捕获
删完发现磁盘空间没释放,是不是没删干净
大概率是文件被进程占用着,尤其是正在读写的日志文件或数据库文件。Linux/macOS 下,文件 inode 被持有,os.remove() 只是解除目录项链接,数据块等进程关闭才真正回收。
立即学习“Python免费学习笔记(深入)”;
- 用
lsof + 文件名(macOS/Linux)或Process Explorer(Windows)查谁占着文件 -
os.remove()返回成功 ≠ 磁盘立即释放,这是系统行为,不是 Python bug - 不要反复调用
os.remove()试图“强制释放”——重复删不存在的文件会抛FileNotFoundError










