1️⃣ 为什么会报 “数据文件不存在”
| | |
|---|
| 路径写错了 | ① 目录层级不对 ② 文件名有多余空格、隐藏字符 ③ 后缀不是 .xlsx 而是 .xls | |
| 字符串转义错误 | Windows 路径里用了 \,如果没有加 原始字符串(r'')或把 \ 写成 \\,\b、\P … 这些会被解释成 转义序列,导致实际路径被破坏 | |
| 文件正在被占用 / 权限不足 | | |
| 脚本运行的工作目录不在项目根目录 | 脚本里用了相对路径(data/...),而实际 cwd 不是项目根目录 | ✅ Step 6(改为绝对/原始路径或把 cwd 设对) |
2️⃣ Step‑by‑step 检查 & 修复
⚡ 推荐先把文件改成一个简短、全英文的名字(比如 sample.xlsx),这样可以避免中文字符在某些旧版编辑器或终端里出现编码错误。改名后记得把脚本里的路径也改成新名字。
Step 1:确认文件真的在该位置
打开 命令行(PowerShell / CMD)并执行:
# 把下面这行完整粘进去(双引号里是你的绝对路径)(Get-Item "路径\文件名").FullName
- 若报错
Cannot find path,说明路径写错或文件不在此处。
小技巧:在文件资源管理器里把文件拖到 PowerShell 窗口,系统会自动把完整路径粘进去,确保没有手动打错。
Step 2:检查文件名的“看不见的字符”
在 PowerShell 中运行:
# 列出文件名的十进制 Unicode 编码(可以看到是否有额外空格或不可见字符)(Get-ChildItem "路径" | Where-Object { $_.Name -match "任一字段" }).Name | ForEach-Object { $chars = $_.ToCharArray() | ForEach-Object { [int][char]$_ } Write-Host "$_ -> $chars" }
如果看到的字符列表里出现 32(空格)或者 65279(BOM/零宽字符),请把文件 重命名 为不带这些字符的名字。
Step 3:确认文件后缀
PowerShell 可以直接告诉你真实后缀:
(Get-Item "路径\文件名").Extension
- 返回
.xls、.csv、甚至空字符串 → 把脚本里的后缀改成相应的 '.xls' 或 '.csv',或者把文件另存为 .xlsx。
Step 4:检查是否被 Excel 锁定
把文件 全部关闭(包括后台可能的 “Excel 自动保存”),然后再跑一次脚本。如果仍然报 FileNotFoundError,说明不是锁定导致的(锁定会报 PermissionError)。
Step 5:把路径写成 原始字符串 或 正斜杠(防止转义)
在 data_preparation.py 中,把 DEFAULT_DATA_PATH 改成下面任意一种写法(两者等价):
# ① 原始字符串(推荐)DEFAULT_DATA_PATH =r'路径\文件名'# ② 正斜杠写法(Windows 也能识别)DEFAULT_DATA_PATH = '路径/文件名'
为什么要这么写?\ 在普通 Python 字符串里是转义符。r'' 告诉解释器 “不要把里面的 \ 当转义字符”,从而得到完整路径。
Step 6:确保脚本使用 绝对路径(防止工作目录错误)
我们在脚本里加一点调试信息,这样即使以后路径错了,你也能第一眼看出到底在找哪儿:
def _load_data(self, path: str) -> pd.DataFrame: """加载数据文件——带调试输出""" p = Path(path) # ------------------- 调试信息 ------------------- print("\n🔎 正在检查文件路径 ...") print(f" 传入的路径 : {path}") print(f" 解析后 Path 对象 : {p}") print(f" 绝对路径 : {p.resolve()}") print(f" 父目录内容 : {[f.name for f in p.parent.iterdir()]}") # ------------------------------------------------ if not p.exists(): raise FileNotFoundError(f"❌ 数据文件不存在: {p.resolve()}")