Python pathlib 物件導向路徑處理

在 Python 3.4 之後,官方引入了 pathlib 模組。它將檔案路徑封裝成一個「物件」,讓我們能以更直觀、可讀性更高的方式來處理路徑,逐漸取代了傳統的 os.path

為何選擇 pathlib?

比起 os.path 將路徑視為「字串」處理,pathlib 將路徑視為「物件」:

  • 可讀性更好:方法與屬性語意化。
  • 操作更直觀:可以使用 / 運算子直接組合路徑。
  • 跨平台一致性:自動處理不同作業系統的分隔符號。

基本用法

建立路徑物件

from pathlib import Path

# 建立目前目錄的路徑物件
p = Path('.')

# 指定特定路徑
data_path = Path('data/users.csv')

# 取得家目錄 (Home Directory)
home = Path.home()

# 取得目前檔案所在的絕對路徑
current_file = Path(__file__).resolve()

組合路徑

不需要再使用 os.path.join(),直接像寫路徑一樣使用 /

from pathlib import Path

base = Path('downloads')
file = base / 'images' / 'sunset.jpg'

print(file)
# macOS/Linux: downloads/images/sunset.jpg
# Windows: downloads\images\sunset.jpg

路徑屬性與操作

提取資訊

from pathlib import Path

path = Path('project/src/main.py')

print(path.name)      # main.py (檔案全名)
print(path.stem)      # main (檔案主名,不含副檔名)
print(path.suffix)    # .py (副檔名)
print(path.parent)    # project/src (父目錄)
print(path.parents[1]) # project (上上層目錄)

檢查路徑狀態

path = Path('config.json')

if path.exists():
    print("路徑存在")
    if path.is_file():
        print("這是一個檔案")
    elif path.is_dir():
        print("這是一個目錄")

檔案與目錄操作

建立與刪除

from pathlib import Path

folder = Path('logs/2024')

# 建立目錄 (parents=True 相當於 os.makedirs)
folder.mkdir(parents=True, exist_ok=True)

# 建立空檔案
file = folder / 'app.log'
file.touch()

# 刪除檔案
# file.unlink()

# 刪除目錄 (必須為空)
# folder.rmdir()

遍歷目錄 (Glob)

pathlib 內建強大的 glob 功能,用於搜尋符合模式的檔案:

from pathlib import Path

p = Path('downloads')

# 列出所有 .txt 檔案
for txt_file in p.glob('*.txt'):
    print(txt_file.name)

# 遞迴搜尋所有子目錄下的 .jpg 檔案
for img in p.rglob('*.jpg'):
    print(img)

讀寫檔案 (捷徑方法)

對於簡單的讀寫,pathlib 提供了更便利的方法,甚至不需要手動 open()

from pathlib import Path

p = Path('hello.txt')

# 直接寫入文字 (預設會覆蓋)
p.write_text('Hello World!', encoding='utf-8')

# 直接讀取全部內容
content = p.read_text(encoding='utf-8')
print(content)

總結

pathlib 是現代 Python 處理路徑的首選:

  1. 使用 Path 物件代替路徑字串。
  2. 使用 / 運算子取代 os.path.join
  3. 使用 read_text()write_text() 快速處理小型檔案。

雖然在某些極端效能要求的場景或與舊版 API 對接時仍會見到 os.path,但在一般開發中,pathlib 能讓你的程式碼更加優雅且易於維護。