python 如何刪除資料夾下的所有檔案和子資料夾?

上海-悠悠發表於2024-03-22

前言

刪除資料夾下的所有的檔案,以及子檔案下所有的檔案,把這個資料夾全部刪除。

shutil.rmtree() 刪除

先介紹一個最簡單的方法,shutil.rmtree()

import shutil
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/


shutil.rmtree('D:\\test', ignore_errors=True)

刪除 D:\test 目錄下全部檔案,並且忽略錯誤

os模組遞迴刪除

可以透過os模組,自己寫個遞迴刪除

import os
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/


def delete_dir_file(dir_path):
    """
    遞迴刪除資料夾下檔案和子資料夾裡的檔案,不會刪除空資料夾
    :param dir_path: 資料夾路徑
    :return:
    """
    if not os.path.exists(dir_path):
        return
    # 判斷是不是一個檔案路徑,並且存在
    if os.path.isfile(dir_path) and os.path.exists(dir_path):
        os.remove(dir_path)  # 刪除單個檔案
    else:
        file_list = os.listdir(dir_path)
        for file_name in file_list:
            delete_dir_file(os.path.join(dir_path, file_name))
    # 遞迴刪除空資料夾
    if os.path.exists(dir_path):
        os.rmdir(dir_path)


if __name__ == '__main__':
    delete_dir_file('./data')

上面程式碼刪除的時候,如果想保留我們資料夾以及子資料夾,僅僅只刪除檔案,可以去掉這句

    # 遞迴刪除空資料夾
    if os.path.exists(dir_path):
        os.rmdir(dir_path)

還有另外一種實現方式

import os
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/


def delete_dir2(dir_path):

    # os.walk會得到dir_path下各個後代資料夾和其中的檔案的三元組列表
    for root, dirs, files in os.walk(dir_path, topdown=False):
        print(root)  # 資料夾絕對路徑
        print(dirs)  # root下一級資料夾名稱列表,如 ['資料夾1','資料夾2']
        print(files)  # root下檔名列表,如 ['檔案1.xx','檔案2.xx']
        # 第一步:刪除檔案
        for name in files:
            os.remove(os.path.join(root, name))  # 刪除檔案
        # 第二步:刪除空資料夾
        for name in dirs:
            os.rmdir(os.path.join(root, name))  # 刪除一個空目錄

    # 加這段程式碼,最外層資料夾也一起刪除
    if os.path.exists(dir_path):
        os.rmdir(dir_path)


delete_dir2('data')

如果需要把最外層目錄一起刪除,可以加上這句

    # 加這段程式碼,最外層資料夾也一起刪除
    if os.path.exists(dir_path):
        os.rmdir(dir_path)

使用 pathlib 模組實現

os模組現在很少用了,用 pathlib 模組替換os 模組相關程式碼

from pathlib import Path
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/


def delete_dir_file(dir_path):
    """
    遞迴刪除資料夾下檔案和子資料夾裡的檔案,不會刪除空資料夾
    :param dir_path: 資料夾路徑
    :return:
    """
    p = Path(dir_path)
    if not p.exists():
        return
    # 判斷是不是一個檔案路徑,並且存在
    if p.is_file() and p.exists():
        p.unlink()  # 刪除單個檔案
    else:
        for file_name in p.iterdir():
            # 遞迴刪除檔案
            delete_dir_file(file_name)
    # 遞迴刪除空資料夾
    if p.exists():
        p.rmdir()


if __name__ == '__main__':
    delete_dir_file('./data')

相關文章