python27是什么文件夹可以删除吗_Python实现删除目录下相同文件

该博客介绍了如何通过优化Python代码提高文件重复检查和删除的效率。作者首先展示了原始代码,该代码通过计算文件的MD5值来查找重复文件并删除。然后,通过使用字典代替列表来存储MD5值,大大减少了查找时间。进一步优化时,作者引入了文件大小的比较,先检查文件大小,减少MD5计算次数,从而将效率提升到7.28秒,提高了十几倍。文章讨论了算法优化的重要性,并邀请读者分享更多优化建议。
摘要由CSDN通过智能技术生成

# -*- 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()

时间效率怎样呢?看下图:

只用了7.28秒!比前两个效率提高了十几倍!这个时间还可以接受

算法是个很神奇的东西,不经意间用一下会有意想不到的收获!上面的代码还可以进一步优化,比如改进查找算法等,读者有啥想法可以和我交流一下。换成C语言来实现可能会更快。呵呵,我喜欢python的简洁!

啊啊!快凌晨两点啦!明天,不,今天还有课呢,悲剧!睡觉去了............

沉睡中。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值