Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path(“你的/路徑”).mkdir(parents=True, exist_ok=True)

加入好友
加入社群
Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

在 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()}")
Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

這段程式碼不僅功能強大,而且語意非常清晰:對著這個路徑物件說「建立目錄」,並指定規則。

3. 功能對照表:一眼看懂差異

為了讓你更清楚何時該用什麼參數,這裡整理了一份速查表:

Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

註:

  • 建立多層目錄:類似 Linux 的 mkdir -p 指令,若中間的路徑不存在會一併建立。
  • 忽略已存在錯誤:這是最常用的安全寫法,避免程式因為目錄已經存在而崩潰。

4. 為什麼你應該改用 pathlib

除了 mkdir 的語法更優雅之外,pathlib 還有以下優勢:

  1. 跨平台兼容:自動處理 Windows (\) 和 macOS/Linux (/) 的路徑分隔符,不用再寫 os.path.join
    • 寫法: Path("data") / "2024" / "file.txt" (使用除法符號拼接,超直觀!)
  2. 整合性強:現代的 Python 函式庫(如 pandas, open())都直接支援 Path 物件。
  3. 屬性存取:想拿檔名?p.name;想拿副檔名?p.suffix。不用再呼叫 os.path.basename() 等函式。
Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

只要涉及「路徑字串」的拼湊、切分、判斷,pathlib 全面勝出。

Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

針對「檔案本身」的增刪改查,pathlib 把這些功能從 os 拿過來封裝得更好。

Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

總結

下次當你需要建立資料夾來存放 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

加入好友
加入社群
Python 現代化開發:告別 os.makedirs,擁抱 pathlib 的優雅; Path("你的/路徑").mkdir(parents=True, exist_ok=True) - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *