Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True)

加入好友
加入社群
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

在 Python 的舊時代,我們處理檔案路徑時常需要在 os.mkdiros.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}")
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

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("   (系統確認:目錄確實存在)")
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

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,所以報錯了!")
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, 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()}")
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

參數速查表

Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python 現代化路徑管理:用 pathlib 一行搞定 os.mkdir 與 os.makedirs; log_dir.mkdir(parents=True, exist_ok=True) - 儲蓄保險王

儲蓄保險王

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

You may also like...

發佈留言

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