遍历目录删除指定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的时候花费的时间比较多。如果能利用多线程,就可以大大提高效率。