pathlib 開始 — 面向對象的路徑處理

在使用 Python 時,處理文件路徑或目錄的事情是非常常見的。例如存儲日誌、讀取和寫入配置文件、整理數據文件等,都是日常工作。這些工作曾經需要混合使用 os.pathglobshutil 等模組來處理,但現在不需要這樣了。為什麼呢?

pathlib 就是答案。

pathlib 是什麼?

pathlib 是自 Python 3.4 開始出現的 專門用於路徑處理的面向對象模組。在早期,文件路徑只是簡單的字符串,而 pathlib 則把“路徑本身”當作一個對象來處理。這使得連接路徑、確認存在性以及讀寫文件的操作更加 明確且易於閱讀

from pathlib import Path

▶ 這個 Path 類別會自動根據您的操作系統,生成 PosixPath(macOS/Linux)或 WindowsPath。所以無需關心自己使用的是哪種操作系統!


pathlib 的必須功能及示例

1. 創建路徑對象

p = Path('data/example.txt')
print(p.resolve())  # 返回絕對路徑

雖然看起來像字符串,但這其實是對象。可以通過多種方法和屬性靈活地處理路徑。

2. 路徑合併:使用 / 運算符

data_dir = Path('data')
file_path = data_dir / 'sample.txt'

使用斜杠運算符 / 可以連接路徑,這是非常 Python 的風格。它的可讀性和穩定性比字符串相加更好。

3. 提取路徑信息

可以輕鬆分離路徑的組成部分,如父目錄、名稱和擴展名等,這點非常方便。

p = Path('data/sample.txt')
print(p.parent)   # data
print(p.name)     # sample.txt
print(p.stem)     # sample
print(p.suffix)   # .txt

4. 確認存在性

結果將以布爾值返回。

p.exists()     # 是否存在
p.is_file()    # 是否為文件?
p.is_dir()     # 是否為目錄?

5. 創建目錄

p = Path('logs/2025/05')
p.mkdir(parents=True, exist_ok=True)

可以一次創建嵌套目錄,並且如果已經存在也不會報錯。

6. 讀寫文件

p = Path('output.txt')
p.write_text("Hello, World!")

text = p.read_text()
print(text)

還可以處理二進制文件:

p.write_bytes(b'binary data')
data = p.read_bytes()

7. 搜索文件/目錄

print(list(Path('.').glob('*.py')))      # 當前文件夾的 .py 文件列表
print(list(Path('.').rglob('*.py')))     # 遞歸搜索子文件夾

glob() 會返回生成器,因此最好將其轉換為列表來查看。

8. 刪除、移動、重命名文件

p.unlink()           # 刪除
p.rename('newname')  # 重命名(在同一目錄下)
p.replace('newpath') # 移動及覆蓋

rename() 可能在目標路徑存在時失敗,因此當需要覆蓋時請使用 replace()。複製操作需要使用 shutil.copy()


os.path vs pathlib 比較

# os.path
import os
os.path.exists('foo/bar.txt')

# pathlib
Path('foo/bar.txt').exists()
  • 代碼更加易讀,可讀性更好。
  • 特別是在 Linux 環境中,語法結構類似於常用的 cdlsmkdir,所以更加熟悉。

為什麼要使用 pathlib?

  • Path 對象 替代字符串,使得代碼更加結構化。
  • 操作系統獨立的路徑處理(Windows vs POSIX)
  • os.pathglobshutil 的功能統一整合
  • 在測試代碼、日誌、錯誤處理等方面 提高維護性

Tux 組裝 Python T 恤上的文件路徑模塊

結語

就像 Counterdefaultdict 讓集合處理變得更加優雅一樣,pathlib 完全改變了處理文件路徑的方式。過去依賴字符串處理的困擾可以拋在腦後。在這篇文章中展示的示例您可以逐個運行,您會發現它比想像中更快上手。

在下一篇文章中,我們將介紹如何通過 shutil 自動化實際的文件複製/備份高級用法。敬請期待!

如果想了解上一篇文章,可以點擊下面的鏈接進行查看。

Python 標準庫 1 - collections.Counter

 Python 標準庫 2 - collections.defaultdict