filenotfounderror本质是操作系统enoent错误,需检查路径各环节;应结合pathlib预检路径、锚定脚本目录、区分文件/目录类型,并用try/except容错而非仅依赖存在性判断。

open() 报 FileNotFoundError 时,先别急着改路径
这个错误不是“文件没找到”那么简单,而是操作系统返回了 ENOENT(错误号 2),说明从路径开头到结尾的任意一环都可能断掉——可能是中间某个目录不存在、路径拼错、大小写不匹配,甚至当前工作目录根本不是你认为的那个目录。
直接用 try/except FileNotFoundError 捕获是必要操作,但不能只靠它兜底。更关键的是在出错前就验证路径有效性:
-
os.path.exists(path)只确认路径存在,不区分是文件还是目录 - 读取前加
os.path.isfile(path),避免把同名目录当文件打开 - 写入前用
Path(path).parent.exists()检查父目录,否则open("logs/app.log", "w")会因logs/不存在而失败 - 用
pathlib.Path构建路径比字符串拼接更可靠,自动处理分隔符和跨平台问题
相对路径失效的典型场景:os.getcwd() 不是你想的目录
很多脚本在 IDE 里能跑,一丢进终端或定时任务就崩,就是因为 os.getcwd() 返回的不是代码所在目录,而是启动命令时的当前目录。
例如你在 /home/user/project/ 下执行 python scripts/run.py,run.py 里写 open("config.json"),Python 就会去 /home/user/config.json 找,而不是 /home/user/project/config.json。
解决办法不是硬切工作目录(os.chdir() 有副作用),而是让路径锚定在脚本自身位置:
from pathlib import Pathscript_dir = Path(__file__).parentconfig_path = script_dir / "config.json"
这样无论在哪运行,路径都从 run.py 所在目录算起。
使用 font_manager.addfont() 添加中文字体文件,设置 rcParams['font.family'],并禁用 unicode_minus,使 matplotlib 显示中文。
FileNotFoundError 被误当成权限错误或 IsADirectoryError
同一个路径,不同操作触发的异常类型可能完全不同:
-
open("data", "r")→ 如果data是个目录,报IsADirectoryError,不是FileNotFoundError -
os.listdir("data")→ 如果data不存在,才报FileNotFoundError -
os.stat("data")→ 目录不存在、文件不存在、甚至无读权限,都统一报FileNotFoundError(Linux/macOS 下权限不足也可能伪装成它)
所以看到 FileNotFoundError,别立刻 assume 是路径写错了。先用 ls -la data(Linux/macOS)或 dir data(Windows)手动验证路径是否存在、类型是否匹配、当前用户是否有权访问。
预检路径存在性 ≠ 彻底规避 FileNotFoundError
用 os.path.exists() 或 Path.exists() 判断完再 open(),看似稳妥,其实引入了竞争条件:判断时存在,open() 前被删了,照样抛异常。
真正健壮的做法是「预判 + 容错」组合:
- 写入前确保父目录存在:
Path("output/report.txt").parent.mkdir(parents=True, exist_ok=True) - 读取配置等关键文件,仍保留
try/except FileNotFoundError并给出明确提示(比如 “请检查 config.json 是否放在项目根目录”) - 避免用
except Exception:吞掉所有异常,否则权限错误、编码错误都会被掩盖
最易被忽略的一点:路径存在且可读,不代表内容格式合法。FileNotFoundError 解决后,紧接着冒出 json.JSONDecodeError 或 pandas.errors.EmptyDataError 的情况非常普遍——别止步于路径不报错,要盯住后续数据解析环节。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










