遍历目录删除指定MD5值的文件

  工作需要实现一个查找出指定目录下md5值与excel表格中md5值相同的文件然后删掉的功能。我是这样做的:首先遍历指定目录,计算该目录下所有文件的md5值,以文件路径为key,md5值为value保存到一个字典中;然后读取excel表格中的md5,查看字典中的value是否包含该md5,如果包含,则删除对应文件。以下是具体实现代码:  

 1 #coding:utf-8
 2 
 3 from hashlib import md5
 4 import os,time,sys
 5 import xlrd
 6 import os
 7  
 8 md5dic = {}
 9 #读取Excel表中的md5值
10 def readXls(fname):
11     xls = xlrd.open_workbook(fname)
12     sheet_name = xls.sheet_names()
13     shxrange = range(xls.nsheets)
14 
15     try:
16         sh = xls.sheet_by_name(sheet_name[0])
17     except:
18         print "no sheet existed"
19     #获取行数
20     nrows = sh.nrows
21     #获取列数
22     ncols = sh.ncols
23     #print "nrows %d, ncols %d" % (nrows,ncols)
24     #获取第一行第一列数据 
25     cell_value = sh.cell_value(1,1)
26     #print cell_value
27      
28     row_list = []
29     #获取各行数据
30     for i in range(1,nrows):
31         row_data = sh.row_values(i)[0]
32         #print row_data
33         row_list.append(row_data)
34     md5list = list(set(row_list))
35     return md5list
36 
37 def calMD5(str):
38   m = md5()
39   m.update(str)
40   return m.hexdigest() 
41    
42 #获取指定文件的md5值  
43 def calMD5ForFile(file):
44   m = md5()
45   a_file = open(file, 'rb')
46   m.update(a_file.read())
47   a_file.close()
48   return m.hexdigest()
49  
50 #获取指定目录下文件的md5值保存到字典中 
51 def calMD5ForFolder(dir):
52     for root, subdirs, files in os.walk(dir):
53         for file in files:
54             filefullpath = os.path.join(root,file)
55             filerelpath = os.path.relpath(filefullpath,dir)
56             md5 = calMD5ForFile(filefullpath)            
57             md5dic[filefullpath] = md5
58     return md5dic
59             
60 #删除与excel表中md5值相同的文件
61 def delFile(filemd5,md5dic):                
62     for filefullpath in md5dic.keys():
63         if md5dic[filefullpath] == filemd5:
64             os.remove(filefullpath)
65             print filemd5,filefullpath
66 
67 if __name__ == "__main__":
68     if len(sys.argv) < 3:
69         print "Please input the file path."
70         sys.exit()
71     xlsdir = sys.argv[1]
72     sourceDir = sys.argv[2]
73     if os.path.exists(sourceDir)==False:
74         print "path not exists"
75     if os.path.isdir(sourceDir)==False:
76         print "not a directory"
77     md5dic = calMD5ForFolder(sourceDir)
78     md5list = readXls(xlsdir)
79     for i in md5list:
80         delFile(i,md5dic)

   不足之处:在进行目录遍历,计算文件md5的时候花费的时间比较多。如果能利用多线程,就可以大大提高效率。

posted @ 2014-11-26 20:06  bamb00  阅读(1201)  评论(0编辑  收藏  举报