python全项目实战系列(十六):基于哈希删除重复文件

本系列旨在通过一系列由浅入深的python实战代码或项目,使普通人也能感受到编程的乐趣,编程能够在平时的工作生活上有所帮助。欢迎查看系列的开篇词和前面文章。

概述

重复文件占用磁盘空间,尤其是微信的文件,一个转发就会多出一个重复文件,一个个来手工查看并删除十分费力。所以分享一个python的实用脚本文件,根据文件的hash值来判断文件是否相同,相同即可删除,节省磁盘空间。

文件名不影响对hash的计算。

可以把哈希值简单地理解成是一段数据(某个文件,或者是字符串)的DNA,或者身份证。

通过一定的哈希算法,将一段较长的对象映射为较短小的hash值,hash的特点是唯一的,一旦对象发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。另外一方面,没有两个数据的哈希值是完全相同的。

代码实现过程

基于hash唯一性的特点,常常用来判断两个文件是否相同。代码的程序结构是:

  1. 定义hashFile函数,用来读取文件,并计算起hash值
  2. 读取文件夹下的文件,子文件夹的也会被读取,写入列表中。
  3. 遍历文件,计算hash值,并进行对比,如果hash值重复,则删除对应的文件。
  4. 打印出删除的文件,如果没有重复文件,也会有提示。

具体代码

import hashlibimport os#通过对文件的hash值比较来判断是否 重复def hashFile(filename):    #对于大文件,如果一起读取,可能会导致内存溢出,因此我们一次读取一个块大小    BLOCKSIZE = 65536    hasher = hashlib.md5()    with open(filename, 'rb') as file:        # 从文件中读取特定的块大小        buf = file.read(BLOCKSIZE)        while(len(buf) > 0):            hasher.update(buf)            buf = file.read(BLOCKSIZE)    return hasher.hexdigest()if __name__ == "__main__":    # 用于存储哈希和文件名的字典    hashMap = {}    # 存储已删除文件的列表    deletedFiles = []    # 这代码文件所在目录下的文件    # filelist = [f for f in os.listdir() if os.path.isfile(f)]        # 直接指定文件目录    filelist = []    filePath = 'C:\Documents\WeChat Files\wxid_hubrboqkd9jr22\FileStorage\File\2022-07\'    for dirpath, dirnames, filenames in os.walk(filePath):        for filename in filenames:            # print(filename)            filelist.append(os.path.join(dirpath, filename))            # filelist.append(filename)    for f in filelist:        key = hashFile(f)        # 如果密钥已存在,则删除该文件        if key in hashMap.keys():            deletedFiles.append(f)            os.remove(f)        else:            hashMap[key] = f    if len(deletedFiles) != 0:        print('删除的文件')        for i in deletedFiles:            print(i)    else:        print('未找到重复文件')

对我的微信保存的文件进行运行结果的如下,可以看出还是删除了不少重复文件的。

C:\ProgramData\Anaconda3\python.exe "G:/OneDrive - shu.edu.cn/1-学习资料/python/python实战项目代码合集/重复文件删除.py"删除的文件C:\Documents\WeChat Files\FileStorage\File\2022-07\20220722-港股晨报.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\20220726-港股晨报.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\22BSSB02779@1000.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\info2soft-i2node-7.1.68.20122900-el6.x86_64.rpmC:\Documents\WeChat Files\FileStorage\File\2022-07\info2soft-i2node-7.1.68.20122900-el7.x86_64.rpmC:\Documents\WeChat Files\FileStorage\File\2022-07\info2soft-i2node-7.1.68.20122900.exeC:\Documents\WeChat Files\FileStorage\File\2022-07\Kubernetes 实践指南(Kubernetes Practice Guide).pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\sources.listC:\Documents\WeChat Files\FileStorage\File\2022-07	ypora-setup-x64.exeC:\Documents\WeChat Files\FileStorage\File\2022-07\unsigned.goC:\Documents\WeChat Files\FileStorage\File\2022-07\vmware openkylin安装心得.txtC:\Documents\WeChat Files\FileStorage\File\2022-07\《如何打一个数据挖掘比赛》入门版.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\《如何打一个数据挖掘比赛》进阶版.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\【通知】北京市总工会机关系统60岁以上老年人疫苗接种集中攻坚行动实施方案.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\上补充说明.docxC:\Documents\WeChat Files\FileStorage\File\2022-07\乾颐堂安全CCIE V6课表(28班)20220801开班(v1).pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\的通知.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\目220726.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\新能源锂电解决方案2.0.pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\新视频课程通告(2).txtC:\Documents\WeChat Files\FileStorage\File\2022-07\新视频课程通告.txtC:\Documents\WeChat Files\FileStorage\File\2022-07\白酒行业数字营销洞察白皮书(2021年).pdfC:\Documents\WeChat Files\FileStorage\File\2022-07\附件1:建设.pdfProcess finished with exit code 0


发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章