Python多文件夹重复文件删除及不合格文件夹清理技术问询
嘿,这两个都是日常文件管理中很实用的需求,我来给你详细拆解解决方案:
1. 用Python删除多文件夹中的重复文件
要删除重复文件,核心是识别内容相同的文件——毕竟文件名可能不一样,但内容重复才是我们要处理的。最靠谱的方式是通过文件哈希值(比如SHA256)来判断,因为哪怕文件大小一样,内容不同哈希值也会不同。当然,为了提高效率,我们可以先对比文件大小,只有大小相同的文件再去计算哈希,这样能节省不少时间。
实现步骤&代码
import os import hashlib def get_file_hash(file_path, chunk_size=4096): """计算文件的SHA256哈希值,分块读取大文件避免内存占用过高""" sha256 = hashlib.sha256() with open(file_path, 'rb') as f: while chunk := f.read(chunk_size): sha256.update(chunk) return sha256.hexdigest() def delete_duplicate_files(root_dir): # 用字典存储哈希值对应的文件列表:key是哈希值,value是文件路径列表 hash_to_files = {} # 遍历根目录下所有文件 for dirpath, _, filenames in os.walk(root_dir): for filename in filenames: file_path = os.path.join(dirpath, filename) # 先获取文件大小,作为初步筛选 file_size = os.path.getsize(file_path) # 用"(大小, 哈希)"作为键,避免不同大小但哈希巧合相同的极端情况 if file_size not in hash_to_files: hash_to_files[file_size] = {} file_hash = get_file_hash(file_path) if file_hash not in hash_to_files[file_size]: hash_to_files[file_size][file_hash] = [] hash_to_files[file_size][file_hash].append(file_path) # 处理重复文件:保留每个哈希组的第一个文件,删除其他 for size_group in hash_to_files.values(): for file_list in size_group.values(): if len(file_list) > 1: # 保留第一个,删除剩下的 for file_to_delete in file_list[1:]: print(f"删除重复文件: {file_to_delete}") # 注释掉下面一行先测试,确认无误后再取消注释执行删除 # os.remove(file_to_delete) # 使用示例:替换成你的根目录路径 delete_duplicate_files("/path/to/your/root/directory")
重要提醒
- 先备份! 测试的时候先只打印要删除的文件,确认没问题再取消
os.remove的注释。 - 大文件多的话,计算哈希会慢,这个分块读取的方式已经尽量优化了,但还是需要点耐心。
- 如果想保留特定位置的文件(比如根目录下的,而非子文件夹的),可以修改逻辑调整保留优先级。
2. 删除不符合要求的文件夹(需包含指定三个7z文件)
这个需求很明确:遍历所有目标文件夹,检查每个文件夹里是否同时存在001.7z、002.7z、003.7z这三个文件,缺一个或者为空的文件夹直接删除。
实现步骤&代码
import os import shutil def delete_invalid_folders(root_dir): # 遍历根目录下的所有子项 for item in os.listdir(root_dir): item_path = os.path.join(root_dir, item) # 只处理文件夹,跳过文件 if not os.path.isdir(item_path): continue # 检查三个必要文件是否都存在 required_files = {"001.7z", "002.7z", "003.7z"} existing_files = set(os.listdir(item_path)) if required_files.issubset(existing_files): print(f"文件夹符合要求,保留: {item_path}") continue # 不符合要求,删除文件夹(包括里面的所有文件) print(f"删除不符合要求的文件夹: {item_path}") # 同样,先测试打印,确认后再取消注释执行删除 # shutil.rmtree(item_path) # 使用示例:替换成你的根目录路径(里面包含那100个各异的文件夹) delete_invalid_folders("/path/to/your/folders/directory")
重要提醒
- 务必先备份!
shutil.rmtree会直接删除整个文件夹及其内容,测试阶段一定要先打印确认要删除的目录。 - 如果文件夹里除了这三个文件还有其他文件,你是否要保留?如果要求只能有这三个文件,那需要修改判断逻辑,改成
existing_files == required_files,而不是子集判断。
内容的提问来源于stack exchange,提问作者user8463149




