# 文件系統與 OS 環境大師:pathlib vs os > **系列 02 – 用 Python 自由掌控資料夾與檔案** 在開發程式時,創建檔案、搬移資料夾、確認路徑等操作不可或缺。Python 為此提供了兩個「正解」: - **`pathlib`**:優雅處理路徑的工具。 - **`os`**:掌控程式執行所在的作業系統環境。 ![機械與數位的結合](/media/editor_temp/6/dde8bc58-b467-4fe2-9370-24899d41a7bd.png) 若把 `pathlib` 視為路徑操作的明星,`os` 則是舞台後台的全能主管,負責燈光、音效、入口等。與其拋棄其中一者,不如根據需求同時使用,達到最乾淨的程式碼。 --- ## 1. os 與 pathlib,究竟有何差異? Python 3.4 以後,`pathlib` 的加入大幅提升了路徑處理的體驗。 - **`os` / `os.path`** - 以 **字串** 方式處理路徑。 - 函式式風格,若連結多段路徑會產生大量 `os.path.join()`、`basename()`、`splitext()` 等呼叫。 - 同時涵蓋 **OS 功能**(環境變數、進程、權限等)。 - **`pathlib`** - 以 **Path 物件** 處理路徑。 - 透過 `/` 運算子與方法鏈結,程式碼更短、更直觀。 - 在檔案/資料夾搜尋、擴展名處理等「路徑工作」上更為方便。 --- ## 2. 必備操作的程式碼對照 ### 2.1 確認目前工作目錄並建立資料夾 ```python 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 路徑連結(差異最明顯的部分) ```python 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` 檔案。 ```python 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 讀寫環境變數(部署、保安、設定的關鍵) 隨著開發與運營環境變化,設定往往會被拆分為環境變數。 ```python 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`。 ```python 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`。 --- **相關文章:** - [[Python 標準函式庫 - 0] Python 標準函式庫是什麼?初學者指南](/ko/whitedec/2026/1/29/python-standard-library/) - [[Python 標準函式庫征服 3 - pathlib](/ko/whitedec/2025/5/8/python-standard-library-pathlib/)