pathlib 開始 — 面向對象的路徑處理
在使用 Python 時,處理文件路徑或目錄的事情是非常常見的。例如存儲日誌、讀取和寫入配置文件、整理數據文件等,都是日常工作。這些工作曾經需要混合使用 os.path
、glob
、shutil
等模組來處理,但現在不需要這樣了。為什麼呢?
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 環境中,語法結構類似於常用的
cd
、ls
、mkdir
,所以更加熟悉。
為什麼要使用 pathlib?
- 用 Path 對象 替代字符串,使得代碼更加結構化。
- 操作系統獨立的路徑處理(Windows vs POSIX)
- 將
os.path
、glob
、shutil
的功能統一整合 - 在測試代碼、日誌、錯誤處理等方面 提高維護性
結語
就像 Counter
、defaultdict
讓集合處理變得更加優雅一樣,pathlib
完全改變了處理文件路徑的方式。過去依賴字符串處理的困擾可以拋在腦後。在這篇文章中展示的示例您可以逐個運行,您會發現它比想像中更快上手。
在下一篇文章中,我們將介紹如何通過 shutil
自動化實際的文件複製/備份高級用法。敬請期待!
如果想了解上一篇文章,可以點擊下面的鏈接進行查看。
Add a New Comment