在 Python 的舊時代,我們處理檔案路徑時常需要在 os.mkdir 和 os.makedirs 之間切換,甚至還要寫額外的 if not os.path.exists(...) 來防止報錯。
自從 Python 3.4 引入 pathlib 後,這些繁瑣的操作都被整合進了一個優雅的物件導向方法中。本文將帶您深入了解如何使用 pathlib 的 .mkdir() 方法來取代舊式的 os 模組操作。
為什麼要用 pathlib?
pathlib 將路徑視為「物件」而非單純的字串。這讓程式碼更易讀、跨平台相容性更好(自動處理 Windows 的 \ 與 Linux 的 /),且 API 設計更加統一。
針對「建立目錄」這件事,pathlib 只有一個方法:.mkdir(),但它透過參數完美涵蓋了所有需求。
實戰演練 (Jupyter Notebook)
請依序執行以下儲存格 (Cell) 來體驗不同參數的效果。
1. 初始化環境
首先,我們匯入必要的模組並定義一個測試用的根目錄,方便稍後清理。
from pathlib import Path
import shutil
# 定義一個測試用的根目錄
base_dir = Path("./demo_folder")
# 如果測試目錄已存在,先移除它以確保環境乾淨 (模擬全新開始)
if base_dir.exists():
shutil.rmtree(base_dir)
print(f"已清理舊的測試目錄: {base_dir}")
else:
print("環境準備就緒")2. 基礎用法:建立單層目錄
這是最嚴格的模式,等同於舊式的 os.mkdir()。
- 限制:父目錄必須存在。
- 限制:目標目錄不能已存在。
# 定義路徑物件
folder_a = base_dir / "folder_a"
# 因為 base_dir (./demo_folder) 還不存在,直接建立子目錄會報錯
try:
folder_a.mkdir()
except FileNotFoundError as e:
print(f"❌ 錯誤發生: {e}")
print("原因:父目錄不存在,無法建立子目錄。")
# 正確做法:先建立父目錄,再建立子目錄 (但在實務上這樣很麻煩)
base_dir.mkdir()
folder_a.mkdir()
print(f"✅ 成功建立: {folder_a}")
3. 進階用法:遞迴建立多層目錄 (parents=True)
這是 pathlib 最強大的地方,等同於舊式的 os.makedirs()。
加上 parents=True 後,Python 會自動幫你把路徑中所有缺少的父目錄一次建立起來。
# 定義一個深層路徑: ./demo_folder/year/month/day
deep_path = base_dir / "2024" / "12" / "25"
# 一行指令建立所有層級
deep_path.mkdir(parents=True)
print(f"✅ 成功遞迴建立多層目錄: {deep_path}")
# 驗證一下是否真的存在
if deep_path.exists():
print(" (系統確認:目錄確實存在)")
4. 容錯處理:忽略已存在的錯誤 (exist_ok=True)
在寫腳本時,最怕的就是程式跑第二次時因為目錄已經存在而 Crash。
加上 exist_ok=True,如果目錄已經在那裡,Python 就會默默略過,不會報錯(FileExistsError)。
target_path = base_dir / "my_config"
# 第一次建立
target_path.mkdir(parents=True, exist_ok=True)
print(f"第一次建立: {target_path} - 成功")
# 第二次執行同樣的程式碼 (模擬重複執行)
try:
target_path.mkdir(parents=True, exist_ok=True)
print(f"第二次建立: {target_path} - 成功 (未報錯)")
except FileExistsError:
print("❌ 發生錯誤:目錄已存在")
# 對照組:如果不加 exist_ok=True
try:
target_path.mkdir(parents=True) # 預設 exist_ok=False
except FileExistsError:
print("❌ 對照組錯誤捕獲:因為沒加 exist_ok=True,所以報錯了!")
5. 總結與最佳實踐
在 90% 的應用場景中(如下載檔案、產生報表、儲存 Log),我們通常希望「確保目錄存在,不管它原本有沒有,且連同父目錄一起建立」。
因此,最推薦的寫法是將兩個參數都設為 True:
# 最佳實踐範例
log_dir = Path("./logs/app/error")
# 這一行是最穩健的寫法
log_dir.mkdir(parents=True, exist_ok=True)
print(f"🚀 最佳實踐演示完成,目錄位於: {log_dir.resolve()}")
參數速查表

推薦hahow線上學習python: https://igrape.net/30afN
![Python: 資料格式如 List[dict],如何快速將SN加入每一個dict中,以利Excel輸出?如何解包dict? **dict ; 將List[dict]的資料轉為pandas.DataFrame 長什麼樣子? Python: 資料格式如 List[dict],如何快速將SN加入每一個dict中,以利Excel輸出?如何解包dict? **dict ; 將List[dict]的資料轉為pandas.DataFrame 長什麼樣子?](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2024/02/20240208093926_0.png?quality=90&zoom=2&ssl=1&resize=350%2C233)









近期留言