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. 查看结果:扫描完成后,会在指定的输出文件中生成重复文件的报告。根据报告中的信息,可以手动删除不需要的重复文件。

注意事项

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

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

相关推荐
Lxinccode1 小时前
python(44) : docker构建支持消费rocketmq的客户端
python·docker·rocketmq·importerror·not found·dynamic library·pyrocketmq
绵羊20232 小时前
ImmuCellAI 免疫浸润分析
linux·python
MediaTea3 小时前
Python IDE:Spyder
开发语言·ide·python
B站_计算机毕业设计之家4 小时前
大数据 Python小说数据分析平台 小说网数据爬取分析系统 Django框架 requests爬虫 Echarts图表 17k小说网 (源码)✅
大数据·爬虫·python·机器学习·数据分析·可视化·小说
都是些老物件4 小时前
TensorFlow中的掩码传递
人工智能·python·tensorflow
理想三旬5 小时前
网络爬虫(上)
python
zzywxc7875 小时前
大模型落地实践指南:从技术路径到企业级解决方案
java·人工智能·python·microsoft·golang·prompt
小小测试开发6 小时前
给贾维斯加“手势控制”:从原理到落地,打造多模态交互的本地智能助
人工智能·python·交互
Python×CATIA工业智造6 小时前
Python数据汇总与统计完全指南:从基础到高阶实战
python·pycharm
MoRanzhi12039 小时前
2. Pandas 核心数据结构:Series 与 DataFrame
大数据·数据结构·人工智能·python·数据挖掘·数据分析·pandas