🧠 Windows 執行 Python 出現「找不到 xlsx」錯誤?完整排除教學(FileNotFoundError 完全解析)

一、問題現象:Python 可以跑,但程式卻「找不到檔案」

很多初學者第一次在 Windows 執行 .py 程式時,都會遇到一個非常困惑的錯誤:

FileNotFoundError: No Excel files found in D:\ImportFolder

明明:

  • Python 已經安裝成功

  • 程式也確實啟動

  • 甚至沒有語法錯誤

但程式就是「立刻停止」。

這種情況其實不是 Python 壞掉,也不是電腦問題,而是程式正在找一個不存在的位置

換句話說:

Python 沒有錯,它只是很誠實地告訴你:「你要我找的東西不在那裡」。


二、為什麼會發生?(新手最容易誤解的觀念)

電腦中的程式不是用「你眼睛看到的資料夾」在工作,
它使用的是 路徑(Path)

例如你桌面看到:

專案資料
├─ program.py
└─ data.xlsx

你以為程式會讀到 data.xlsx

但實際上 Python 可能在找:

C:\Windows\System32\data.xlsx

因為它的執行位置不是你想像的那個資料夾。

這就是 90% FileNotFoundError 的真正原因。


三、最典型錯誤寫法

初學者最常寫出這種程式:

DATA_DIR = "D:\\ImportFolder"
files = [f for f in os.listdir(DATA_DIR) if f.endswith(".xlsx")]

if not files:
raise FileNotFoundError("找不到 Excel")

問題是:

你電腦根本沒有
D:\ImportFolder
這個資料夾。

所以程式正確地報錯


四、真正的問題:程式的「工作位置」與「檔案位置」不同

Windows 在執行 Python 時,有一個概念叫:

工作目錄(Working Directory)

你以為你在資料夾執行程式,
但其實 Windows 可能從別的位置啟動 Python。

因此程式會往錯誤的位置找檔案。


五、工程師正確寫法(推薦做法)

不要寫死磁碟機路徑。

應該讓程式「自動找到自己所在的位置」。

改成這樣:

from pathlib import Path

# 找到目前程式所在資料夾
CURRENT_FOLDER = Path(__file__).parent

# 指定子資料夾
INPUT_FOLDER = CURRENT_FOLDER / "input_data"

excel_files = list(INPUT_FOLDER.glob("*.xlsx"))

if len(excel_files) == 0:
raise RuntimeError("資料夾中沒有任何 Excel 檔案")

對應的資料夾結構:

專案
├─ script.py
└─ input_data
├─ report1.xlsx
└─ report2.xlsx

這樣無論:

  • 換電腦

  • 換磁碟

  • 用排程

  • 用批次檔

都能正常執行。

這是實務開發的標準寫法。


六、另一個隱藏陷阱:Excel 其實存在,但仍報錯

你可能會遇到更奇怪的情況:

資料夾裡明明有 Excel,
程式仍然說找不到。

原因是:

Excel 開著時,會產生暫存檔

例如:

~$sales.xlsx

這不是正式檔案,而是 Excel 的鎖定檔。

解決方式:

valid_files = [
f for f in INPUT_FOLDER.glob("*.xlsx")
if not f.name.startswith("~$")
]

七、如何確認 Python 到底在找哪裡?

這一步非常重要,也是工程師排錯的第一步。

加入除錯訊息:

import os

print("目前執行位置:", os.getcwd())
print("資料夾是否存在:", INPUT_FOLDER.exists())
print("實際路徑:", INPUT_FOLDER)

你會立刻知道:

程式正在看哪個資料夾,而不是你以為的那個。


八、最簡單的檢查清單(Checklist)

當你遇到 FileNotFoundError,依序檢查:

  1. 路徑是否存在

  2. 副檔名是否正確(.xlsx / .xls)

  3. Excel 是否開啟

  4. 程式執行位置是否正確

  5. 是否用排程執行(排程最常發生)


九、為什麼工程師不建議寫死路徑?

很多人會想:

直接指定磁碟機不就好了?

錯。

在企業環境會出現:

  • 伺服器沒有 D 槽

  • 同事電腦是 E 槽

  • 排程服務帳號沒有權限

  • 網路磁碟尚未掛載

因此寫死路徑的程式,幾乎一定在部署時壞掉

這也是自動化專案最常見的失敗原因之一。


十、結論

FileNotFoundError 並不可怕,它其實是:

Python 在保護你的資料處理流程。

真正的問題通常不是程式,而是「路徑觀念」。

只要記住一句話:

不要讓程式找檔案,要讓程式先找到自己。

當程式能知道自己的位置,就能永遠找到資料。


如果你正在學習 Python 自動化、報表、資料匯入或批次處理,
理解「路徑」會比學任何語法都更重要。

這一步跨過去,你就從「能寫程式」變成「會寫工具」的工程師了。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)