Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Python 遞歸刪除非空目錄腳本:os.walk 實現與原理解析

編輯:關於伺服器

標準庫 shutil.rmtree() 已完美支援非空目錄刪除,但理解底層實現有助於定制需求(如過濾、日誌、權限處理)。

腳本代碼(Python 2/3 相容)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys

def remove_path(path):
    if os.path.isdir(path):
        for root, dirs, files in os.walk(path, topdown=False):
            for name in files:
                file_path = os.path.join(root, name)
                os.remove(file_path)
                print("Deleted file:", file_path)
            for name in dirs:
                dir_path = os.path.join(root, name)
                os.rmdir(dir_path)
                print("Deleted dir:", dir_path)
        os.rmdir(path)
        print("Deleted root dir:", path)
    else:
        os.remove(path)
        print("Deleted file:", path)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        for arg in sys.argv[1:]:
            remove_path(arg)
    else:
        print("Usage: rm.py path1 path2 ...")

關鍵點解析

  • os.walk(topdown=False):後序遍歷,先處理最深層檔案/目錄,再向上刪除父目錄,避免「目錄非空」錯誤
  • os.remove() 刪除檔案,os.rmdir() 刪除空目錄
  • 異常處理:生產環境建議加 try/except OSError 記錄權限不足、檔案被佔用等錯誤

現代最佳實踐

# Python 3.12+ 推薦
import shutil
shutil.rmtree(path, ignore_errors=False, onerror=handle_error)

# 需保留根目錄僅清空內容
for item in os.scandir(path):
    if item.is_file():
        os.remove(item.path)
    else:
        shutil.rmtree(item.path)

常見坑點

  • 符號連結:os.walk 預設不跟隨,shutil.rmtree 會刪除連結本身而非目標
  • Windows 長路徑:啟用 \\?\ 前綴或設定註冊表 LongPathsEnabled
  • 權限不足:需管理員/Root 或檔案擁有者權限
Copyright © Windows教程網 All Rights Reserved