当前位置: 首页 » 综合知识 » it知识 » 正文

Python如何删除目录下的相同文件

发布时间:2023-07-20 以下文章来源于网友投稿,内容仅供参考!
# -*- coding: cp936 -*-  import md5  import os  from time import clock as now  def getmd5(filename):      file_txt = open(filename,'rb').read()      m = md5.new(file_txt)      return m.hexdigest()  def main():      path = raw_input("path: ")      all_md5=[]      total_file=0     total_delete=0     start=now()      for file in os.listdir(path):          total_file += 1;          real_path=os.path.join(path,file)          if os.path.isfile(real_path) == True:              filemd5=getmd5(real_path)              if filemd5 in all_md5:                  total_delete += 1                  print '删除',file              else:                  all_md5.append(filemd5)      end = now()      time_last = end - start      print '文件总数:',total_file      print '删除个数:',total_delete      print '耗时:',time_last,'秒'        if __name__=='__main__':       main()

上面的程序原理很简单,就是依次读取每个文件,计算md5,如果md5在md5列表不存在,就把这个md5加到md5列表里面去,如果存在的话,我们就认为这个md5对应的文件已经出现过,这个图片就是多余的,然后我们就可以把这个图片删除了。在这个文件夹下面有8674个文件,有31个是重复的,找到所有重复文件共耗时155.5秒。效率不算高,能不能进行优化呢?我分析了一下,我的程序里面有两个功能比较耗时间,一个是计算每个文件的md5,这个占了大部分时间,还有就是在列表中查找md5是否存在,也比较费时间的。从这两方面入手,我们可以进一步优化。

首先我想的是解决查找问题,或许我们可以对列表中的元素先排一下序,然后再去查找,但是列表是变化的,每次都排序的话效率就比较低了。我想的是利用字典进行优化。字典最显著的特点是一个key对应一个值我们可以把md5作为key,key对应的值就不需要了,在变化的情况下字典的查找效率比序列效率高,因为序列是无序的,而字典是有序的,查找起来当然更快。这样我们只要判断md5值是否在所有的key中就可以了。下面是改进后的代码:

# -*- coding: cp936 -*-  import md5  import os  from time import clock as now  def getmd5(filename):      file_txt = open(filename,'rb').read()      m = md5.new(file_txt)      return m.hexdigest()  def main():      path = raw_input("path: ")      all_md5={}      total_file=0     total_delete=0     start=now()      for file in os.listdir(path):          total_file += 1;          real_path=os.path.join(path,file)          if os.path.isfile(real_path) == True:              filemd5=getmd5(real_path)              if filemd5 in all_md5.keys():                  total_delete += 1                  print '删除',file              else:                  all_md5[filemd5]=''      end = now()      time_last = end - start      print '文件总数:',total_file      print '删除个数:',total_delete      print '耗时:',time_last,'秒'        if __name__=='__main__':       main()

再看看运行截图

从时间上看,确实比原来快了一点,但是还不理想。下面还要进行优化。还有什么可以优化呢?md5!上面的程序,每个文件都要计算md5,非常费时间,是不是每个文件都需要计算md5呢?能不能想办法减少md5的计算次数呢?我想到了一种方法:上面分析时我们提到,可以通过比较文件大小的方式来判断图片是否完全相同,速度快,但是这种方法是不准确的,md5是准确的,我们能不能把两者结合一下?答案是肯定的。我们可以认定:如果两个文件完全相同,那么这两个文件的大小和md5一定相同,如果两个文件的大小不同,那么这两个文件肯定不同!这样的话,我们只需要先查看文件的大小是否存在在size字典中,如果不存在,就将它加入到size字典中,如果大小存在的话,这说明有至少两张图片大小相同,那么我们只要计算文件大小相同的文件的md5,如果md5相同,那么这两个文件肯定完全一样,我们可以删除,如果md5不同,我们把它加到列表里面,避免重复计算md5.具体代码实现如下:

# -*- coding: cp936 -*-  import md5  import os  from time import clock as now  def getmd5(filename):      file_txt = open(filename,'rb').read()      m = md5.new(file_txt)      return m.hexdigest()  def main():      path = raw_input("path: ")      all_md5 = {}      all_size = {}      total_file=0     total_delete=0     start=now()      for file in os.listdir(path):          total_file += 1          real_path=os.path.join(path,file)          if os.path.isfile(real_path) == True:              size = os.stat(real_path).st_size              name_and_md5=[real_path,'']              if size in all_size.keys():                  new_md5 = getmd5(real_path)                  if all_size[size][1]=='':                      all_size[size][1]=getmd5(all_size[size][0])                  if new_md5 in all_size[size]:                      print '删除',file                      total_delete += 1                  else:                      all_size[size].append(new_md5)              else:                  all_size[size]=name_and_md5      end = now()      time_last = end - start      print '文件总数:',total_file      print '删除个数:',total_delete      print '耗时:',time_last,'秒'        if __name__=='__main__':       main()
  • • Linux Ecdsa密钥长度选择有何依据

    在Linux

  • • Linux Khook在内核监控中的应用如何

    Linux

  • • Linux Gsoap是否支持异步通信

    GSOAP是

  • • Linux Coremail如何提升用户体验

    提升Linu

  • • Linux Ecdsa算法有哪些局限性

    ECDSA

  • 哎呀音乐钢琴键盘学习《 钢琴主人训练营》 西瓜学琴
    郭蝈 陪练钢琴 30节课时 考级刚需 让孩子每一次练琴都是高质量的
    30天轻松学会五线谱 流行钢琴自学初级教程 牙牙学琴
    流行爵士钢琴实战技巧VIP课 - 继伟 哎呀音乐
    【海上钢琴师】原版 MT1990钢琴谱
    百首经典流行钢琴实战曲集 - 继伟
    雷费尔德电钢琴重锤88键专业考级儿童初学者数码电子钢琴家用
    小练咖 真人钢琴陪练 1v1服务 2999随时退 1课时50分钟 考级刚需
    雅马哈电钢琴88键重锤CLP735智能数码电子钢琴家用专业初学者考级
    【原装进口】Yamaha/雅马哈钢琴 b121 SC2原声静音钢琴
  • 珠海专业调钢琴
  • 天津宝坻区调钢琴
  • 天津静海区钢琴调音
  • 成都简阳市钢琴调律
  • 大连瓦房店市钢琴调音
  • 眉山调钢琴联系方式
  • 惠州大亚湾钢琴调琴师
  • 长治调琴师
  • 厦门湖里区钢琴调音师
  • 上海普陀区钢琴调音师