在 Python 的檔案處理歷史中,我們長期依賴 os 模組來處理路徑與目錄。但自從 Python 3.4 引入 pathlib 後,檔案系統的操作變得更加物件導向且直觀。
今天我們來探討一個最常見的需求:「如何建立一個多層目錄(包含中間不存在的資料夾)?」 並比較新舊兩種寫法的差異。
1. 傳統寫法:os.makedirs
在過去,如果你想要建立一個像 data/2025/raw_files 這樣的深層目錄,你通常會這樣寫:
import os
path = r"D:\Temp\data\2025\raw_files"
# 傳統做法
if not os.path.exists(path):
os.makedirs(path)或者更簡潔一點,使用 exist_ok=True 來避免目錄已存在時報錯:
import os
# 如果目錄已存在,不會報錯 (Python 3.2+)
os.makedirs(r"D:\Temp\data\2025\raw_files", exist_ok=True)2. 現代寫法:pathlib.Path.mkdir
pathlib 將路徑視為「物件」,而非單純的字串。這讓程式碼的可讀性大幅提升。
要達到與 os.makedirs 完全相同的效果(自動建立父目錄、忽略已存在錯誤),你需要掌握兩個關鍵參數:
parents=True:自動建立中間缺失的父目錄(等同於 Linux 的mkdir -p)。exist_ok=True:如果目標目錄已經存在,程式繼續執行,不拋出FileExistsError。
實作範例
# %%
from pathlib import Path
# 定義路徑物件
p = Path(r"D:\Temp\data\2025\raw_files")
# 一行搞定:建立多層目錄,且安全忽略已存在的情況
p.mkdir(parents=True, exist_ok=True)
print(f"目錄已準備就緒:{p.resolve()}")這段程式碼不僅功能強大,而且語意非常清晰:對著這個路徑物件說「建立目錄」,並指定規則。
3. 功能對照表:一眼看懂差異
為了讓你更清楚何時該用什麼參數,這裡整理了一份速查表:
註:
- 建立多層目錄:類似 Linux 的
mkdir -p指令,若中間的路徑不存在會一併建立。 - 忽略已存在錯誤:這是最常用的安全寫法,避免程式因為目錄已經存在而崩潰。
4. 為什麼你應該改用 pathlib?
除了 mkdir 的語法更優雅之外,pathlib 還有以下優勢:
- 跨平台兼容:自動處理 Windows (
\) 和 macOS/Linux (/) 的路徑分隔符,不用再寫os.path.join。- 寫法:
Path("data") / "2024" / "file.txt"(使用除法符號拼接,超直觀!)
- 寫法:
- 整合性強:現代的 Python 函式庫(如 pandas, open())都直接支援 Path 物件。
- 屬性存取:想拿檔名?
p.name;想拿副檔名?p.suffix。不用再呼叫os.path.basename()等函式。
只要涉及「路徑字串」的拼湊、切分、判斷,pathlib 全面勝出。
針對「檔案本身」的增刪改查,pathlib 把這些功能從 os 拿過來封裝得更好。
總結
下次當你需要建立資料夾來存放 Log、數據或備份檔案時,請忘記 os.makedirs,試試看這個現代化的組合技:
Path("你的/路徑").mkdir(parents=True, exist_ok=True)推薦hahow線上學習python: https://igrape.net/30afN
在現代 Python 開發中,我們強烈建議保持**「型別一致性」**。既然你已經將路徑定義為 Path 物件,就應該直接使用它提供的方法,而不是混用 os 模組。
以下是三種常見寫法的推薦順序:
🥇 第一名:直接使用 Path 物件的方法 (最推薦)
這是最優雅、最符合物件導向設計的寫法。程式碼簡潔,且能享受 IDE 的自動補全功能。
from pathlib import Path
p = Path("data/2025/reports")
# ✅ 推薦:直接呼叫物件本身的方法
p.mkdir(parents=True, exist_ok=True)🥈 第二名:os 模組直接接收 Path 物件 (次之)
從 Python 3.6 開始,os 模組的大多數函數(如 os.makedirs, os.path.join)都已經支援直接傳入 Path 物件,不需要手動轉字串。雖然這不是最「現代」的寫法,但至少保持了程式碼的簡潔。
import os
from pathlib import Path
p = Path("data/2024/reports")
# 🆗 可接受:os 模組現在看得懂 Path 物件,不需轉型
os.makedirs(p, exist_ok=True)🥉 第三名:手動轉成字串再傳給 os (不推薦)
這是最舊式的寫法。手動呼叫 str(p) 不僅多餘,還會讓程式碼變得冗長,破壞了閱讀的流暢感。除非你使用的第三方庫非常老舊、不支援 PathLike 介面,否則應避免這種寫法。
import os
from pathlib import Path
p = Path("data/2024/reports")
# ❌ 不推薦:多此一舉的轉型,破壞了程式碼的簡潔性
os.makedirs(str(p), exist_ok=True)總結建議
養成好習慣:一旦將路徑封裝成 Path 物件後,就請「從一而終」。這不僅讓程式碼更易讀,也減少了型別轉換間可能產生的隱形錯誤。
推薦hahow線上學習python: https://igrape.net/30afN