在 Python 自動化腳本中,我們最常做的事情之一就是「把某個資料夾裡的所有特定檔案抓出來」。
看著你的檔案總管截圖,位於 D:\Temp 底下有許多 .docx 檔案(如 demo.docx, demo_result.docx 等)。今天我們就以這個場景為例,來比較傳統的 glob 模組與現代的 pathlib 模組有何不同,以及為什麼你應該選擇後者。
準備工作
首先,我們設定好要搜尋的路徑。
from pathlib import Path
# 設定目標資料夾 (注意 Windows 路徑在 Python 中建議使用 / 或 raw string r"")
folder_path = Path("D:/Temp")選手 1:傳統派 glob.glob()
這是 Python 早期最常用的方法。雖然它現在也支援讀取 Path 物件,但它的本質還是「字串處理」。
程式碼範例:
import glob
# 寫法:必須自己把路徑跟搜尋樣式 (*.docx) 拼起來
# 雖然 glob 支援傳入 Path 物件,但通常習慣傳字串
pattern = str(folder_path / "*.docx")
files_glob = glob.glob(pattern)
print(f"找到 {len(files_glob)} 個檔案 (型態: {type(files_glob[0])})")
for f in files_glob[:3]: # 只列出前3個示範
print(f)輸出結果:

缺點分析:
- 回傳的是「字串 (String)」:這意味著如果你想取得檔名(不含路徑)、副檔名,或是檔案大小,你必須額外
import os來處理字串切割,非常麻煩。 - 需要額外 import:你必須多引入一個
glob模組。
選手 2:現代派 Path_Obj.glob()
既然你已經在使用 pathlib 定義路徑了,直接呼叫物件本身的方法是最直覺的。
程式碼範例:
# 不需要 import glob,只要有 pathlib 即可
# 寫法:直接對 Path 物件下指令
# 注意:回傳的是 generator,通常我們會用 list() 轉成列表,或是直接跑迴圈
files_pathlib = list(folder_path.glob("*.docx"))
print(f"找到 {len(files_pathlib)} 個檔案 (型態: {type(files_pathlib[0])})")
for f in files_pathlib[:3]:
print(f)輸出結果:

優點分析(為什麼這比較好?):
- 回傳的是「物件 (Path Object)」:這是最大的差異!回傳的不是冷冰冰的字串,而是功能強大的物件。
- 屬性隨手可得:想拿檔名?想拿副檔名?直接用屬性(Property)拿,不用寫字串處理邏輯。
終極對決:如果我想取得「純檔名」?
讓我們看看如果要從你的 D:\Temp 裡把 demo.docx 這個名字取出來(不要路徑),兩者寫法的差異:
使用 glob.glob() (痛苦的寫法)
# %%
import glob
import os # 還要多 import os
files = glob.glob("D:/Temp/*.docx")
for f in files:
# 必須用 os.path.basename 來切割字串
filename = os.path.basename(f)
print(filename)
# 輸出: demo.docx
使用 Path.glob() (優雅的寫法)
from pathlib import Path
p = Path("D:/Temp")
for f in p.glob("*.docx"):
# 直接呼叫 .name 屬性,超直覺!
print(f.name)
# 輸出: demo.docx
# 同場加映:只要主檔名 (demo)
# print(f.stem)輸出結果:

強烈建議使用 Path.glob()。

以後別再問 glob 支不支援 Path 物件了,直接把 glob 模組忘掉,擁抱 Path(...).glob() 吧!
推薦hahow線上學習python: https://igrape.net/30afN
如何挖出子資料夾裡的檔案 (Recursive Search)
目標:不只搜尋 D:\Temp,還要深入搜尋 D:\Temp\data、D:\Temp\By H4 等所有子資料夾內的 *.docx。
選手 1:glob.glob() 的遞迴寫法
在 glob 模組中,要開啟遞迴搜尋,你必須做兩件事:
- 在路徑中使用
**通配符(代表任意層級的目錄)。 - 加上
recursive=True參數(很容易忘記加這個,導致搜不到東西)。
程式碼範例:
import glob
# 注意:必須寫 "**" 並且加上 recursive=True
# 這樣的語法稍顯冗長,且容易寫錯
files_glob = glob.glob("D:/Temp/**/*.docx", recursive=True)
print(f"包含子資料夾共找到:{len(files_glob)} 個檔案")缺點: 語法直覺性較差,少寫一個參數就失效。
在 glob 的路徑模式中,** 是一個非常特殊的通配符(Wildcard),它的意思是:
「匹配任意層級的目錄(包含零層,也就是當前目錄)」。
我們可以把它拆解來看:
*(單星號):
代表匹配檔名或單一層資料夾名稱中的任意字元。- 例如
D:/Temp/*.docx只會找D:/Temp這一層底下的 Word 檔。
- 例如
**(雙星號):
代表匹配路徑中的 所有子目錄結構,不管它有多深。- 當你寫
D:/Temp/**/*.docx時,Python 會這樣找:D:/Temp/a.docx(第 0 層,直接在 Temp 下)D:/Temp/data/b.docx(第 1 層)D:/Temp/By H4/old/backup/c.docx(第 3 層)
- 它就像是一個鑽頭,會鑽進去所有的資料夾裡面找。
- 當你寫
重要提醒:
在 glob.glob() 函式中,** 必須搭配 recursive=True 參數才會生效。如果你只寫了 ** 但忘了加 recursive=True,Python 只會把它當作普通的字元處理,通常就甚麼都找不到了。
選手 2:Path.glob() 的遞迴寫法
使用 pathlib 時,你不需要額外的參數,只要在 pattern 裡加上 ** 即可。
程式碼範例:
from pathlib import Path
p = Path("D:/Temp")
# 只要在 glob 裡面加上 **/ 即可
files_path = list(p.glob("**/*.docx"))
print(f"包含子資料夾共找到:{len(files_path)} 個檔案")
👑 選手 3:最強大招 Path.rglob()
這是 pathlib 完勝的關鍵功能。它提供了一個專門的方法叫 rglob (Recursive Glob)。你完全不需要寫 **,它自動會幫你遞迴搜尋。
這對於懶得記通配符語法的人來說是救星。
程式碼範例:
from pathlib import Path
p = Path("D:/Temp")
# rglob = recursive glob
# 你只要寫 "*.docx",它自動等同於 "**/*.docx"
files_rglob = list(p.rglob("*.docx"))
print(f"使用 rglob 找到:{len(files_rglob)} 個檔案")
# 如果 data 資料夾裡有檔案,現在就會顯示出來了
for f in files_rglob:
print(f)總結比較表

結論:
如果你需要搜尋 D:\Temp 及其子資料夾下的所有 Word 檔,請直接使用 Path("D:/Temp").rglob("*.docx")。這是最優雅、最不容易寫錯的 Pythonic 寫法。
推薦hahow線上學習python: https://igrape.net/30afN
![Python: 如何在pandas.read_csv() or pandas.read_excel() 中使用keep_default_na =False , na_values =[] 保留文件中的原始“NA”? Python: 如何在pandas.read_csv() or pandas.read_excel() 中使用keep_default_na =False , na_values =[] 保留文件中的原始“NA”?](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2024/05/20240530215737_0.png?quality=90&zoom=2&ssl=1&resize=350%2C233)


![Python Pandas GroupBy 的 size 陷阱:為什麼你的計數結果總是不對?如何計算重複次數? duplicates = df.duplicated( subset = [‘name’] ) Python Pandas GroupBy 的 size 陷阱:為什麼你的計數結果總是不對?如何計算重複次數? duplicates = df.duplicated( subset = [‘name’] )](https://i1.wp.com/savingking.com.tw/wp-content/uploads/2025/06/20250609143758_0_53821c.png?quality=90&zoom=2&ssl=1&resize=350%2C233)



![Python: 如何使用 os.environ[“PATH”] 設定環境變數?與 sys.path.append() 差別為何? Python: 如何使用 os.environ[“PATH”] 設定環境變數?與 sys.path.append() 差別為何?](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2024/09/20240905135312_0_890fa1.png?quality=90&zoom=2&ssl=1&resize=350%2C233)


近期留言