文件系統與 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


相關文章: