文件系統與 OS 環境大師:pathlib vs os
系列 02 – 用 Python 自由掌控資料夾與檔案
在開發程式時,創建檔案、搬移資料夾、確認路徑等操作不可或缺。Python 為此提供了兩種「理想方案」:
- pathlib:優雅處理路徑的工具。
- os:掌控程式執行所在的作業系統環境。

若把 pathlib 視為路徑操作的明星,os 則是舞台後台的全能主管,負責燈光、音效、入口等。與其拋棄其中一者,不如根據需求同時使用,達到最乾淨的程式碼。
1. os 與 pathlib,究竟有何差異?
Python 3.4 以後,pathlib 的加入大幅提升了路徑處理的體驗。
os/os.path- 以 字串 方式處理路徑。
- 以函式為基礎的風格,若連結多段路徑會需要大量
os.path.join()、basename()、splitext()等函式呼叫。 -
同時涵蓋 OS 功能(環境變數、進程、權限等)。
-
pathlib - 以 Path 物件 處理路徑。
- 透過
/運算子與方法鏈結,程式碼更短、更直觀。 - 在檔案/資料夾搜尋、擴展名處理等「路徑工作」上更為方便。
2. 必備操作的程式碼對照
2.1 確認目前工作目錄並建立資料夾
import os
from pathlib import Path
# os 方式
current_os = os.getcwd()
if not os.path.exists("test_os"):
os.makedirs("test_os")
# pathlib 方式
current_pl = Path.cwd()
Path("test_pl").mkdir(exist_ok=True)
提示:若程式碼中路徑頻繁出現,pathlib 更利於維護。
2.2 路徑連結(差異最明顯的部分)
import os
from pathlib import Path
# os 方式
path_os = os.path.join("usr", "bin", "python")
# pathlib 方式(斜線運算子)
path_pl = Path("usr") / "bin" / "python"
路徑連結越多,pathlib 的可讀性越高。
3. 為何推薦使用 pathlib:路徑物件的力量
pathlib 的優勢不止於連結。當你需要取得檔案資訊時,差距更為明顯。
| 功能 | os.path 方式 |
pathlib 方式 |
|---|---|---|
| 檔名提取 | os.path.basename(p) |
p.name |
| 去除擴展名的檔名 | os.path.splitext(os.path.basename(p))[0] |
p.stem |
| 擴展名 | os.path.splitext(p)[1] |
p.suffix |
| 父目錄 | os.path.dirname(p) |
p.parent |
這些「小」差異累積起來,統一使用 pathlib 能讓團隊程式碼更整潔。
4. 實戰範例:尋找特定擴展名的檔案
以下示範如何在專案資料夾內搜尋所有 .txt 檔案。
from pathlib import Path
base_path = Path.cwd()
txt_files = list(base_path.rglob("*.txt")) # 包含子資料夾的遞迴搜尋
for file in txt_files:
print(f"檔名: {file.name}, 絕對路徑: {file.resolve()}")
只需一行 rglob(),即可完成遞迴搜尋。pathlib 在「尋找檔案」上表現卓越。
5. os 的獨門強項:作業系統環境的掌控
這裡才是兩者平衡的核心。
pathlib 是路徑專家,但 os 才能操作作業系統本身。
5.1 讀寫環境變數(部署、保安、設定的關鍵)
隨著開發與運營環境變化,設定往往會被拆分為環境變數。
import os
# 讀取
db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db")
# 寫入(通常只影響目前進程)
os.environ["APP_ENV"] = "production"
API 金鑰、執行模式、日誌等皆屬於 os 的範疇。
5.2 執行外部命令:直接「委託」OS
執行外部指令或管理進程本質上是 OS 功能。雖然 subprocess 更常用,但其底層仍是 os。
import os
# 簡易執行(回傳結束碼)
exit_code = os.system("echo hello")
print(exit_code)
更細緻的進程控制(執行、替換、分叉等)亦屬於 os。
5.3 權限、使用者、工作目錄等「環境本身」
- 權限變更(Unix 系統):
os.chmod() - 變更工作目錄:
os.chdir() - 取得進程/使用者資訊:
os.getpid()等
這些功能 pathlib 無法取代,完全屬於 os 的專屬領域。
6. 結論:讓 pathlib 與 os 分工合作
- 路徑操作 / 檔案搜尋 / 檔名處理 →
pathlib更易讀、維護。 - 環境變數 / 進程 / 權限 / OS 功能 →
os承擔。
最佳實踐:
- 處理路徑時一律使用 Path 物件。
- 需要與 OS 互動時,直接使用 os。
7. 小結
pathlib大幅提升檔案系統程式碼的可讀性與穩定性。os負責管理作業系統環境。- 正確的做法是
pathlib + os的結合。
一句話總結:路徑/檔案工作用 pathlib,OS 環境控制用 os。
相關文章:
目前沒有評論。