You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.7z002.7z003.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

火山引擎 最新活动