Python 实现磁盘文件去重:节省空间、清理重复文件技巧

当我们在使用电脑时,常常会遇到磁盘空间不足的问题。其中一个重要原因是大量的重复文件占据了磁盘空间。这些重复文件可能是无意中下载的多个版本文件,或者是软件安装过程中产生的重复备份。手动查找和删除这些重复文件不仅耗时耗力,还容易遗漏。而使用 Python 编写的文件去重脚本,可以高效地解决这个问题。

代码原理

该代码通过计算文件的 MD5 哈希值来判断文件是否重复。首先,它会遍历指定的驱动器中的所有文件,按文件大小进行分组。然后对大小相同的文件计算 MD5 哈希值,如果两个文件的哈希值相同,则认为它们是重复文件。

代码的核心功能如下:

计算文件的 MD5 哈希值

通过 hashlib 库计算文件的 MD5 哈希值,这是一种常用的文件内容标识方法。

python 复制代码
def get_file_hash(file_path, block_size=65536):
    """计算文件的MD5哈希值"""
    hasher = hashlib.md5()
    try:
        with open(file_path, 'rb') as f:
            buf = f.read(block_size)
            while len(buf) > 0:
                hasher.update(buf)
                buf = f.read(block_size)
        return hasher.hexdigest()
    except (PermissionError, FileNotFoundError, OSError):
        # 如果无法访问文件,返回None
        return None

查找重复文件

遍历指定的驱动器,按文件大小分组。只对大小相同的文件计算哈希值,以减少计算量。最后将哈希值相同的文件视为重复文件。

python 复制代码
def find_duplicate_files(drives):
    """查找重复文件"""
    print("开始扫描磁盘中的文件...")

    # 先按文件大小分组,减少哈希计算次数
    size_dict = defaultdict(list)
    total_files = 0

    # 遍历所有指定的驱动器
    for drive in drives:
        for root, _, files in os.walk(drive):
            for filename in files:
                file_path = os.path.join(root, filename)
                try:
                    file_size = os.path.getsize(file_path)
                    size_dict[file_size].append(file_path)
                    total_files += 1
                    if total_files % 1000 == 0:
                        print(f"已扫描 {total_files} 个文件...")
                except (OSError, PermissionError):
                    continue

    print(f"文件扫描完成,共扫描 {total_files} 个文件。")
    print("开始计算文件哈希值以查找重复...")

    # 对于大小相同的文件,计算哈希值
    hash_dict = defaultdict(list)
    potential_duplicates = 0

    for size, file_list in size_dict.items():
        if len(file_list) > 1:  # 只处理大小相同的文件
            potential_duplicates += len(file_list)
            for file_path in file_list:
                file_hash = get_file_hash(file_path)
                if file_hash:  # 如果成功计算了哈希值
                    hash_dict[file_hash].append(file_path)

    print(f"哈希值计算完成,处理了 {potential_duplicates} 个潜在重复文件。")

    # 找出重复文件(哈希值相同的文件)
    duplicates = {hash_val: paths for hash_val, paths in hash_dict.items() if len(paths) > 1}
    return duplicates

输出结果

将查找到的重复文件信息输出到指定的文件中。这有助于我们查看和管理重复文件。

python 复制代码
# 将结果写入文件
with open(args.output, 'w', encoding='utf-8') as f:
    f.write(f"重复文件报告 - 生成时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
    f.write(f"扫描的驱动器: {', '.join(args.drives)}\n\n")

    if not duplicate_files:
        f.write("未找到重复文件。\n")
    else:
        duplicate_groups = 0
        total_duplicates = 0

        for hash_val, file_paths in duplicate_files.items():
            duplicate_groups += 1
            total_duplicates += len(file_paths)

            f.write(f"重复组 #{duplicate_groups} (MD5: {hash_val}):\n")
            for path in file_paths:
                f.write(f"  {path}\n")
            f.write("\n")

        f.write(f"总结: 发现 {duplicate_groups} 组重复文件,共 {total_duplicates} 个文件。\n")
        f.write(f"扫描用时: {time.time() - start_time:.2f} 秒\n")

使用方法

  1. 安装依赖库 :确保你的 Python 环境中安装了 oshashlib 库。如果没有安装,可以通过 pip install 安装。

  2. 运行脚本:在命令行中运行脚本,指定要扫描的驱动器和输出文件名。

bash 复制代码
python duplicate_file_finder.py --drives E:/ --output duplicate_files_report.txt
  1. 查看结果:扫描完成后,会在指定的输出文件中生成重复文件的报告。根据报告中的信息,可以手动删除不需要的重复文件。

注意事项

  • 备份重要文件:在删除重复文件之前,建议先备份重要文件,以免误删。
  • 权限问题:如果某些文件由于权限问题无法访问,脚本会自动跳过这些文件。
  • 性能问题:如果磁盘中的文件数量非常多,扫描和计算哈希值可能会需要较长时间。

通过这个脚本,你可以轻松地找到磁盘中的重复文件,并释放宝贵的存储空间。如果你对这段代码有疑问或需要进一步优化,欢迎随时在下方评论区留言交流。

相关推荐
陈敬雷-充电了么-CEO兼CTO39 分钟前
复杂任务攻坚:多模态大模型推理技术从 CoT 数据到 RL 优化的突破之路
人工智能·python·神经网络·自然语言处理·chatgpt·aigc·智能体
YOLO大师1 小时前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
xiao5kou4chang6kai41 小时前
【Python-GEE】如何利用Landsat时间序列影像通过调和回归方法提取农作物特征并进行分类
python·gee·森林监测·洪涝灾害·干旱评估·植被变化
kaikaile19951 小时前
使用Python进行数据可视化的初学者指南
开发语言·python·信息可视化
Par@ish1 小时前
【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭
windows·python·web安全
意疏2 小时前
【Python篇】PyCharm 安装与基础配置指南
开发语言·python·pycharm
冬天给予的预感4 小时前
DAY 54 Inception网络及其思考
网络·python·深度学习
钢铁男儿4 小时前
PyQt5高级界而控件(容器:装载更多的控件QDockWidget)
数据库·python·qt
亿牛云爬虫专家8 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
蹦蹦跳跳真可爱58912 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉