电脑上存了几百万张小图片,让电脑慢慢删除了5个小时还没有删完,就写了一个python脚本,开启多线程删除,调整线程数量,让CPU和硬盘占有率都到100%,1个小时就删除了.感谢这段代码哈.
逻辑为删除当前目录下所有二级子目录中的文件,每个二级子目录由一个线程处理,每当一个线程完成任务后,线程池会自动分配新的任务给空闲的线程.直到删除完毕.
import os
from concurrent.futures import ThreadPoolExecutor
import threading# 创建一个线程安全的计数器
class Counter:def __init__(self):self._value = 0self._lock = threading.Lock()def increment(self):with self._lock:self._value += 1return self._valuedef get_value(self):with self._lock:return self._value# 全局计数器
deleted_files_counter = Counter()def delete_files_in_subdir(subdir):# 获取完整的子目录路径subdir_path = os.path.join(os.getcwd(), subdir)# 确认路径是一个目录if os.path.isdir(subdir_path):# 遍历子目录中的所有文件try:for filename in os.listdir(subdir_path):file_path = os.path.join(subdir_path, filename)# 确认路径是一个文件if os.path.isfile(file_path):try:os.remove(file_path)# 获取相对路径rel_path = os.path.join(subdir, filename)# 增加计数并获取当前总数total = deleted_files_counter.increment()print(f"已删除文件:{rel_path} (总计删除:{total}个文件)")except Exception as e:print(f"无法删除文件 {rel_path}:{e}")# 检查目录是否为空if not os.listdir(subdir_path):try:os.rmdir(subdir_path)print(f"已删除空目录:{subdir}")except Exception as e:print(f"无法删除空目录 {subdir}:{e}")except Exception as e:print(f"处理目录 {subdir} 时发生错误:{e}")def main():# 获取当前目录下的所有二级子目录subdirs = [d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]# 使用线程池管理线程with ThreadPoolExecutor(max_workers=200) as executor:# 提交任务到线程池futures = [executor.submit(delete_files_in_subdir, subdir) for subdir in subdirs]# 等待所有任务完成for future in futures:future.result()print(f"文件删除完成,共删除 {deleted_files_counter.get_value()} 个文件。")if __name__ == "__main__":main()
使用方法:
放到待删除的文件的上级目录
运行结果:
已删除文件:197665\104807.png (总计删除:315169个文件)
已删除文件:197673\102730.png (总计删除:315260个文件)
已删除文件:197745\101351.png (总计删除:315339个文件)
我的笔记本是SSD硬盘,大约1秒钟删除2千张图片