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

时间:2023-03-09 07:02:50
遍历目录删除指定MD5值的文件

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

 #coding:utf-8

 from hashlib import md5
import os,time,sys
import xlrd
import os md5dic = {}
#读取Excel表中的md5值
def readXls(fname):
xls = xlrd.open_workbook(fname)
sheet_name = xls.sheet_names()
shxrange = range(xls.nsheets) try:
sh = xls.sheet_by_name(sheet_name[0])
except:
print "no sheet existed"
#获取行数
nrows = sh.nrows
#获取列数
ncols = sh.ncols
#print "nrows %d, ncols %d" % (nrows,ncols)
#获取第一行第一列数据
cell_value = sh.cell_value(1,1)
#print cell_value row_list = []
#获取各行数据
for i in range(1,nrows):
row_data = sh.row_values(i)[0]
#print row_data
row_list.append(row_data)
md5list = list(set(row_list))
return md5list def calMD5(str):
m = md5()
m.update(str)
return m.hexdigest() #获取指定文件的md5值
def calMD5ForFile(file):
m = md5()
a_file = open(file, 'rb')
m.update(a_file.read())
a_file.close()
return m.hexdigest() #获取指定目录下文件的md5值保存到字典中
def calMD5ForFolder(dir):
for root, subdirs, files in os.walk(dir):
for file in files:
filefullpath = os.path.join(root,file)
filerelpath = os.path.relpath(filefullpath,dir)
md5 = calMD5ForFile(filefullpath)
md5dic[filefullpath] = md5
return md5dic #删除与excel表中md5值相同的文件
def delFile(filemd5,md5dic):
for filefullpath in md5dic.keys():
if md5dic[filefullpath] == filemd5:
os.remove(filefullpath)
print filemd5,filefullpath if __name__ == "__main__":
if len(sys.argv) < 3:
print "Please input the file path."
sys.exit()
xlsdir = sys.argv[1]
sourceDir = sys.argv[2]
if os.path.exists(sourceDir)==False:
print "path not exists"
if os.path.isdir(sourceDir)==False:
print "not a directory"
md5dic = calMD5ForFolder(sourceDir)
md5list = readXls(xlsdir)
for i in md5list:
delFile(i,md5dic)

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