攝影或3C

Python Pathlib 實戰:優雅地篩選多種圖片檔案; images = [f for f in p.glob(“*”) if f.suffix.lower() in img_extensions]

在 Python 中處理檔案時,我們常會遇到需要篩選特定類型檔案的需求。例如:「我要抓出資料夾裡所有的圖片」。

傳統的寫法可能需要寫很大一串,甚至還要想辦法處理副檔名大小寫的問題(.jpg vs .JPG)。其實,使用 pathlib 配合列表推導式(List Comprehension),一行程式碼就能優雅搞定!

核心技巧
利用 Path.glob(“*”) 抓取所有檔案,再透過集合(Set)來進行快速篩選。

from pathlib import Path

# 設定目標資料夾 (這裡是當前目錄)
p = Path(".")

# 定義我們要的副檔名 (使用 Set 提升查找效率)
# 包含常見的圖片格式全部使用小寫
img_extensions = {
    '.jpg', '.jpeg', '.png', '.gif', 
    '.bmp', '.tiff', '.webp', '.svg', '.ico'
}

# 核心語法一行搞定篩選
# f.suffix.lower() -> 自動把副檔名轉小寫解決 .JPG 抓不到的問題
images = [f for f in p.glob("*") if f.suffix.lower() in img_extensions]

# 輸出結果
print(f"找到 {len(images)} 張圖片:")
for img in images:
    print(img.name)

為什麼這樣寫最好?
跨平台:pathlib 自動處理了 Windows () 和 Linux (/) 的路徑分隔符差異。
不分大小寫:f.suffix.lower() 確保了 photo.JPG 和 icon.Png 都不會被漏掉。
效能高:使用 set (大括號 {…}) 來檢查成員 (in),比用 list ([…]) 快得多。
好擴充:想多抓影片檔?只要在 img_extensions 裡加上 .mp4 即可,邏輯完全不用改。
進階:遞迴搜尋 (Recursive)
如果你想連子資料夾裡面的圖片一起抓,只需要把 glob(“*“) 改成 rglob(“*”):

# 找出當前目錄及其所有子目錄下的圖片
all_images = [f for f in p.rglob("*") if f.suffix.lower() in img_extensions]

告別擁擠的 os.listdir 和 endswith,投入 pathlib 的懷抱吧!

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

  1. pathlib.Path 沒有 recursive=True 參數
    在標準函式庫 glob 模組中,我們習慣寫:
import glob
# 需要配合 **  recursive=True
files = glob.glob("**/*.jpg", recursive=True) 

但在 pathlib 中,沒有 recursive 這個參數。它是直接拆分成兩個不同的方法:

path.glob(““):只找這一層(不遞迴)。 path.rglob(““):找所有層(遞迴,Recursive Glob)。

  1. 為什麼這樣設計?
    rglob(““) 其實就是 glob(“/“) 的縮寫。
    為了讓語法更簡潔,pathlib 直接提供 rglob 這個方法名,讓開發者不用每次都在 pattern 裡寫 **。

比較表

所以,想遞迴搜尋時,直接呼叫 rglob 是最地道 (Pythonic) 的寫法!

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

儲蓄保險王

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