Python读取文件报错FileNotFoundError怎么处理

云舒
云舒
发布时间:2026-10-27 | 3人浏览过
原创

核心排查与解决路径:当 Python 报出 FileNotFoundError: [Errno 2] No such file or directory 时,本质原因是操作系统在 Python 解释器当前认定的路径上未找到对应文件。通常只需要三步即可解决:首先调用 os.getcwd() 检查程序运行时的实际工作目录;接着使用 pathlib.Path(__file__).resolve().parent 改用以脚本位置为基准的绝对定位;最后核对扩展名与反斜杠转义问题,并在必要时添加 try...except 容错结构。

一、认识 FileNotFoundError 报错的具体表现

在 Python 中使用 open() 或第三方库读取本地文件时,一旦给出的路径无法被解析到具体的实体文件,系统就会触发内置的 FileNotFoundError 异常。标准的错误终端输出通常如下所示:

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    with open("config.json", "r", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'config.json'

报错信息清晰地传达了三个事实:抛出错误的代码行号(第 4 行)、导致失败的操作(试图以只读模式打开文件),以及系统反馈的失败原因(找不到名为 config.json 的文件或目录)。面对这个报错,无需盲目猜测,建议遵循一套标准的排查工作流程依次推演。

Python读取文件报错FileNotFoundError怎么处理
图 1:处理 FileNotFoundError 的四步排查流程示意

二、核心根因排查:当前工作目录与相对路径偏差

超过七成以上的 FileNotFoundError 并非因为文件不存在,而是由于“代码以为的当前目录”与“操作系统执行时的当前工作目录(Current Working Directory,CWD)”不一致。

很多开发者误以为:只要把 data.txt 和 run.py 放在同一个子文件夹内,直接写 open('data.txt') 就一定能打开。然而,Python 的相对路径不是相对于脚本文件 run.py 所在的文件夹,而是相对于启动终端时所在的目录。

Python读取文件报错FileNotFoundError怎么处理
图 2:执行工作目录与脚本物理目录在路径解析中的机制差异

如何自查当前工作目录

在代码中加入两行诊断输出,即可立即看清 Python 正在哪里寻找文件:

import os

print("当前工作目录:", os.getcwd())
target_filename = "data.txt"
print("完整查找路径:", os.path.abspath(target_filename))
提示:在 VS Code、PyCharm 等编辑器中点击“运行”按钮时,工作目录通常默认是项目的根工作区,而不是你右键点击的子文件所在目录。这就是为什么“在终端手动 cd 进去执行能跑,但在 IDE 里点运行就报错”的根本原因。

三、物理文件与路径书写常见细节陷阱

当工作目录确认无误但依然报错时,需要核实以下三个容易被忽略的细节:

1. Windows 隐藏已知文件扩展名

在 Windows 操作系统中,资源管理器默认勾选了“隐藏已知文件类型的扩展名”。用户新建一个名为 data.txt 的文本文档时,系统往往会自动追加 .txt 后缀,实际物理全名变成了 data.txt.txt。此时 Python 读取 data.txt 便会自然报错。可以在 Windows 资源管理器的“查看”菜单中勾选“文件扩展名”,检查真实名称。

2. 反斜杠转义冲突

Windows 的路径分隔符为反斜杠 \。而在 Python 字符串中,反斜杠代表转义符:

# 错误示例:\t 会被转义为制表符,\n 会被转义为换行符
path = "C:\test\new_project\data.txt"

# 正确示例 A:使用 raw 原始字符串(推荐在硬编码路径时使用)
path = r"C:\test\new_project\data.txt"

# 正确示例 B:统一使用跨平台的正斜杠(Python 内部完全支持)
path = "C:/test/new_project/data.txt"

3. 大小写敏感与多余空格

Linux 和 macOS 操作系统默认严格区分文件名大小写,例如 Data.csv 与 data.csv 是两个完全独立的文件。同时,从网页或聊天工具复制文件名时,文件名前后可能会混入不可见的空格或特殊空白符,使用 filename.strip() 进行清理可以避免此类问题。

四、工程级解决方案与路径处理技术选型

在编写生产环境或团队协作的 Python 代码时,不应依赖脆弱的相对路径。Python 提供了多种路径管理方案,其演进与特性对比如下:

Python读取文件报错FileNotFoundError怎么处理
图 3:三种文件路径处理方案的综合对比与选型建议

最佳实践代码:使用 pathlib 进行绝对锚定

现代 Python(3.4+)推荐使用内置的标准库 pathlib。通过 Path(__file__) 获取当前执行脚本的绝对路径,再提取其父目录,即可彻底摆脱终端工作目录的干扰:

from pathlib import Path

# 获取当前脚本所在文件夹的绝对路径
BASE_DIR = Path(__file__).resolve().parent

# 使用斜杠操作符优雅拼接子目录与文件名
data_file = BASE_DIR / "data" / "users.csv"

# 读取文件内容
try:
    with open(data_file, "r", encoding="utf-8") as f:
        content = f.read()
        print("读取成功,总字符数:", len(content))
except FileNotFoundError:
    print(f"未能找到目标文件,请确认以下路径是否正确:\n{data_file}")

健壮性补充:加入防御性判断与异常处理

在面对可能被外部删除或尚未生成的动态文件时,有两种处理哲学:

  • 预先判断(LBYL 风格):在打开前调用 data_file.exists() 与 data_file.is_file(),适合非必选文件的读取逻辑。
  • 捕获异常(EAFP 风格):使用 try...except FileNotFoundError 包裹。这是 Python 社区更倡导的方式,因为在多线程或并发环境下,预先检查与打开文件之间可能发生时间窗口竞争(Race Condition)。

五、常见诱因与对策速查矩阵

为了帮助快速对照排错,下表将可能引发 FileNotFoundError 的四类最核心场景与其排查要点做了结构化归纳:

Python读取文件报错FileNotFoundError怎么处理
图 4:常见原因与对策速查矩阵

六、如何确认问题已经彻底解决

完成路径修改后,可以通过以下三个操作验证问题是否真正得到根治:

  1. 切换不同目录执行测试:在终端中 cd 到上一级目录甚至系统的用户根目录,然后执行 python /完整路径/run.py。如果无论在哪个目录下运行都能正常读入文件,说明已摆脱工作目录依赖。
  2. 使用不存在的文件名触发测试:故意修改一个不存在的文件名,检查程序是否能进入 except FileNotFoundError 分支并打印出清晰的路径提示,而不是直接抛出未经处理的堆栈崩溃。
  3. 多平台路径兼容测试:如果在团队开发中涉及 Windows 与 macOS/Linux 混用,确认路径中没有写死的反斜杠 \,保证统一使用 pathlib.Path。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表