杰瑞科技汇

Python如何批量删除文件夹下所有文件?

使用 shutil 模块(推荐)

这是最推荐的方法,因为它代码简洁、可读性强,并且能很好地处理各种边界情况(如文件权限、符号链接等)。

Python如何批量删除文件夹下所有文件?-图1
(图片来源网络,侵删)

shutil.rmtree() 用于删除一个目录以及其下的所有内容(文件和子目录),os.mkdir()Path.mkdir() 用来重新创建一个空的目录。

代码示例

import shutil
import os
# 定义要清空的文件夹路径
folder_path = 'my_folder'
# 1. 检查文件夹是否存在
if os.path.exists(folder_path):
    try:
        # 2. 删除整个文件夹及其所有内容
        shutil.rmtree(folder_path)
        # 3. 重新创建一个空的文件夹
        os.mkdir(folder_path)
        print(f"文件夹 '{folder_path}' 已成功清空!")
    except OSError as e:
        print(f"删除文件夹时出错: {e}")
else:
    print(f"文件夹 '{folder_path}' 不存在。")

使用 pathlib 模块 (Python 3.4+) 的现代写法:

pathlib 是 Python 官方推荐的面向对象的路径操作库,代码更优雅。

from pathlib import Path
# 定义要清空的文件夹路径
folder_path = Path('my_folder')
# 1. 检查文件夹是否存在
if folder_path.exists():
    try:
        # 2. 删除整个文件夹及其所有内容
        folder_path.rmdir() # 注意:rmdir() 只能删除空目录,所以这里不适用
        # 正确的做法是使用 shutil.rmtree
        shutil.rmtree(folder_path)
        # 3. 重新创建一个空的文件夹
        folder_path.mkdir()
        print(f"文件夹 '{folder_path}' 已成功清空!")
    except OSError as e:
        print(f"删除文件夹时出错: {e}")
else:
    print(f"文件夹 '{folder_path}' 不存在。")

shutil.rmtree + pathlib.mkdir 的最佳实践:

Python如何批量删除文件夹下所有文件?-图2
(图片来源网络,侵删)
import shutil
from pathlib import Path
folder_path = Path('my_folder')
if folder_path.is_dir(): # 使用 is_dir() 更精确地检查
    shutil.rmtree(folder_path)
    folder_path.mkdir() # mkdir() 默认会创建一个空目录
    print(f"文件夹 '{folder_path}' 已成功清空!")
else:
    print(f"路径 '{folder_path}' 不是一个文件夹或不存在。")

使用 os 模块遍历并删除

这种方法更底层,需要自己编写循环来遍历和删除,它可以帮助你理解底层发生了什么,但代码稍显复杂。

代码示例

import os
folder_path = 'my_folder'
# 1. 检查文件夹是否存在
if not os.path.isdir(folder_path):
    print(f"文件夹 '{folder_path}' 不存在或不是一个目录。")
    exit()
# 2. 遍历文件夹中的所有文件和子目录
for filename in os.listdir(folder_path):
    # 构建完整的文件路径
    file_path = os.path.join(folder_path, filename)
    try:
        # 3. 检查是文件还是目录
        if os.path.isfile(file_path) or os.path.islink(file_path):
            # 删除文件
            os.unlink(file_path)
            print(f"已删除文件: {file_path}")
        elif os.path.isdir(file_path):
            # 如果是子目录,递归调用自身来清空
            # 注意:这里直接调用自己会删除子目录下的所有内容,但不会删除子目录本身
            # 如果想连子目录也删掉,应该用 os.rmdir(file_path),但前提是它必须是空的
            # 为了彻底清空,最好递归调用一个清空函数
            pass # 这里不处理递归,只处理当前目录
    except Exception as e:
        print(f"删除 {file_path} 时出错: {e}")
print(f"文件夹 '{folder_path}' 下的所有文件已删除。")

注意:上面的 os 模块示例只删除了当前目录下的文件和链接,并没有处理子目录,如果要递归删除所有子目录和文件,需要更复杂的逻辑,这通常会让代码变得臃肿。除非有特殊需求,否则强烈推荐使用 shutil.rmtree()


使用 pathlib 模块遍历并删除

这是 os 模块方法的现代 pathlib 版本,同样需要循环,但代码更清晰。

代码示例

from pathlib import Path
folder_path = Path('my_folder')
# 1. 检查路径是否存在并且是一个目录
if not folder_path.is_dir():
    print(f"路径 '{folder_path}' 不是一个文件夹或不存在。")
    exit()
# 2. 遍历目录下的所有内容
for item in folder_path.iterdir():
    try:
        # 3. 删除文件或目录
        # item.unlink() 用于删除文件或符号链接
        # item.rmdir() 用于删除空目录
        # 如果要删除非空目录,需要递归
        if item.is_file() or item.is_symlink():
            item.unlink()
            print(f"已删除: {item}")
        elif item.is_dir():
            # 递归删除子目录及其内容
            # shutil.rmtree 是最简单的方式
            shutil.rmtree(item)
            print(f"已删除目录: {item}")
    except Exception as e:
        print(f"删除 {item} 时出错: {e}")
print(f"文件夹 '{folder_path}' 下的所有内容已删除。")

总结与对比

方法 优点 缺点 适用场景
shutil.rmtree() + os.mkdir() 代码最简洁、可读性高、最可靠 需要两步操作(删除整个目录,再重建) 绝大多数情况下的首选,简单高效。
os 模块遍历 灵活性高,可以在删除前对每个文件进行检查或处理 代码复杂,容易出错,处理递归逻辑麻烦 需要在删除前对每个文件进行特殊操作时。
pathlib 模块遍历 代码比 os 模块更清晰、更面向对象 同样需要循环,逻辑比 shutil 复杂 倾向于使用 pathlib 进行所有路径操作,且需要在删除前进行文件处理时。

⚠️ 重要警告

删除文件是不可逆操作! 在运行任何删除脚本之前,请务必:

  1. 备份重要数据:确保你已经备份了文件夹中需要保留的文件。
  2. 仔细检查路径:在脚本中多次打印 folder_path 变量的值,确认它指向的是你想要清空的文件夹,而不是系统关键目录(如 C:\Windows/etc)。
  3. 先在测试环境运行:先在一个不重要的文件夹上测试你的脚本,确保它能按预期工作。

一个更安全的做法:在删除前,先将要删除的文件列表打印出来,确认无误后再执行删除操作。

import shutil
from pathlib import Path
folder_path = Path('my_folder_to_delete')
if folder_path.is_dir():
    # --- 安全检查:先列出将要删除的文件 ---
    print("将要删除以下内容:")
    for item in folder_path.rglob('*'): # rg('*') 递归查找所有文件和目录
        print(f"  - {item}")
    # --- 确认操作 ---
    confirm = input("\n确认要删除以上所有内容吗?(y/n): ")
    if confirm.lower() == 'y':
        shutil.rmtree(folder_path)
        print("删除完成。")
    else:
        print("操作已取消。")
else:
    print(f"文件夹 '{folder_path}' 不存在。")
分享:
扫描分享到社交APP
上一篇
下一篇