Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用?

加入好友
加入社群
Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

在 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)

輸出結果:

Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

缺點分析:

  1. 回傳的是「字串 (String)」:這意味著如果你想取得檔名(不含路徑)、副檔名,或是檔案大小,你必須額外 import os 來處理字串切割,非常麻煩。
  2. 需要額外 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)

輸出結果:

Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

優點分析(為什麼這比較好?):

  1. 回傳的是「物件 (Path Object)」:這是最大的差異!回傳的不是冷冰冰的字串,而是功能強大的物件。
  2. 屬性隨手可得:想拿檔名?想拿副檔名?直接用屬性(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
Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

使用 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)

輸出結果:

Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

強烈建議使用 Path.glob()

Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

以後別再問 glob 支不支援 Path 物件了,直接把 glob 模組忘掉,擁抱 Path(...).glob() 吧!

推薦hahow線上學習python: https://igrape.net/30afN

如何挖出子資料夾裡的檔案 (Recursive Search)

目標:不只搜尋 D:\Temp,還要深入搜尋 D:\Temp\dataD:\Temp\By H4 等所有子資料夾內的 *.docx

選手 1:glob.glob() 的遞迴寫法

glob 模組中,要開啟遞迴搜尋,你必須做兩件事:

  1. 在路徑中使用 ** 通配符(代表任意層級的目錄)。
  2. 加上 recursive=True 參數(很容易忘記加這個,導致搜不到東西)。

程式碼範例:

import glob

# 注意必須寫 "**" 並且加上 recursive=True
# 這樣的語法稍顯冗長且容易寫錯
files_glob = glob.glob("D:/Temp/**/*.docx", recursive=True)

print(f"包含子資料夾共找到:{len(files_glob)} 個檔案")

缺點: 語法直覺性較差,少寫一個參數就失效。

glob 的路徑模式中,** 是一個非常特殊的通配符(Wildcard),它的意思是:

「匹配任意層級的目錄(包含零層,也就是當前目錄)」

我們可以把它拆解來看:

  1. * (單星號):
    代表匹配檔名或單一層資料夾名稱中的任意字元。
    • 例如 D:/Temp/*.docx 只會找 D:/Temp 這一層底下的 Word 檔。
  2. ** (雙星號):
    代表匹配路徑中的 所有子目錄結構,不管它有多深。
    • 當你寫 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)} 個檔案")
Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

👑 選手 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)

總結比較表

Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

結論:
如果你需要搜尋 D:\Temp 及其子資料夾下的所有 Word 檔,請直接使用 Path("D:/Temp").rglob("*.docx")。這是最優雅、最不容易寫錯的 Pythonic 寫法。

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python 檔案搜尋實戰:glob.glob() vs Path.glob() 誰更好用? - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *