昨天的收據放在一個每天換名字的資料夾裡。字串路徑一碰到反斜槓就斷,Path 物件不會。怎麼列檔案才不用猜分隔符?
pathlib 模組把路徑變成一個帶有屬性和方法的物件。它能處理 Windows 與 POSIX 的分隔符,避免大多數字串拼接錯誤,還能用一行程式碼讀寫小型文字檔。 你還會替換路徑的單個部分、穩定地列出檔案,並拒絕目錄穿越。
用 / 拼接路徑
斜槓運算子在這裡不是除法,而是拼接路徑。Path 重載了 /,讓各部分連起來。每一段保持普通字串即可,具體分隔符交給 pathlib 根據作業系統決定。
from pathlib import Path
path = Path("data") / "scores.csv"
print(path.as_posix())
print(path.name)不靠字串加法拼路徑
查看路徑的各個部分
name 是最後一段,stem 是去掉最後一個後綴的檔名,suffix 包含點號。parent 回傳所在目錄。這些屬性比一串 split 呼叫更好讀。
from pathlib import Path
path = Path("reports/2026-summary.txt")
print(path.stem)
print(path.suffix)
print(path.parent.as_posix())檔名、後綴與父目錄
讀寫 UTF-8 文字
write_text 會建立或覆蓋檔案,read_text 回傳檔案內容。顯式傳入 encoding='utf-8',結果就不會隨機器區域設定變化。範例結束後記得清理臨時檔案。
from pathlib import Path
path = Path("pypractice-note.txt")
path.write_text("hello\n", encoding="utf-8")
print(path.read_text(encoding="utf-8").strip())
path.unlink()一個小文字檔
只替換一個部分,不要拼接字串
with_name 和 with_suffix 只替換一個組成部分,保留其餘路徑。它們比在整個字串上做 replace() 安全,因為不會誤改目錄名。Path 本身不可變,每次呼叫都會回傳新物件。
from pathlib import Path
path = Path("reports/2026-summary.txt")
print(path.with_name("2027-summary.txt").as_posix())
print(path.with_suffix(".md").as_posix())
print((path.parent / "archive" / path.name).as_posix())替換名稱、後綴或父目錄
穩定地列出檔案
glob() 回傳的是檔案系統順序,並不保證已排序。展示結果或比較結果前要先排序。TemporaryDirectory 給範例一個私有目錄,即使程式碼區塊例外退出也會清理。
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as tmp:
root = Path(tmp)
(root / "b.txt").write_text("tea", encoding="utf-8")
(root / "a.txt").write_text("latte", encoding="utf-8")
(root / "skip.md").write_text("x", encoding="utf-8")
for path in sorted(root.glob("*.txt")):
print(path.name, path.read_text(encoding="utf-8"))排序 glob 的結果,而不是相信檔案系統
表單值不是安全路徑
Path(raw).name 只保留最後一段,因此 ../secret.txt 不能從這一層直接逃出目錄。這只是起點,不是完整的安全策略:還要使用允許列表、解析最終路徑,並確認它仍在目標根目錄內,再打開檔案。
from pathlib import Path
for raw in ["notes.txt", "../secret.txt", "/etc/passwd"]:
safe_name = Path(raw).name
print(raw, "->", safe_name)拼接前先去掉目錄部分
本課要點
- Path('folder') / 'file.txt' 可以安全地拼接路徑。
- name、stem、suffix 和 parent 分別暴露路徑的不同部分。
- 不傳 encoding 時,read_text 和 write_text 使用平臺預設編碼。
- 輸出必須始終使用正斜槓時,用 as_posix()。
- 路徑組成部分用 Path 方法處理;不要把不可信文字直接拼到根目錄後面。
常見錯誤
- 用字串 + 拼路徑,卻忘記補分隔符。
- 需要穩定、可移植的字串時,直接列印 Path 物件。
- 讀寫文字時不指定 UTF-8。
- 對整個路徑呼叫 replace(),誤改了父目錄名。
建立 Path('data') / 'scores.csv',列印它的 name、suffix,以及用 POSIX 形式表示的 parent。
動手試試
改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。