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

  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/goodhacker/p/4124804.html
Copyright © 2020-2023  润新知