天天看點

python3 編寫超簡單的重複檔案掃描工具

參考我之前的文章( python3 編寫簡單的掃描相同檔案工具 )做的簡化

代碼

import os,json,codecs
import hashlib
##############

_path = ["I:\\大電影","H:\\小電影","J:\\電影"]  # 路徑 (自定義)
#讀取大檔案的時候如果直接讀取所有可能就很慢,這裡示例就讀取部分
_read_s=1024*1024 #截取開始大小
_read_e=1024*1024*5#截取結束大小
########## 
def wrJson(path,jsonMap):#寫入json
    f= codecs.open(path,'w',"utf-8") 
    f.write(json.dumps(jsonMap,ensure_ascii=False))
    f.close() 
     
    
def getFileMd5(files):  # 擷取Md5
    srcl = open(files, 'rb')
    m2 = hashlib.md5()
    m2.update(srcl.read(_read_e)[_read_s:_read_e])
    srcl.close()
    return m2.hexdigest()

_size_map1 = {}  # 第一次過濾
_size_map2 = {}  # 第二次過濾
_size_map3 = {}  # 第三次過濾

#第一次根據大小進行分組
def fileFilter1(path): 
    if os.path.isdir(path):
        files = os.listdir(path)
        for f in files:
            p = path + "\\" + f
            fileFilter1(p)
    else:
        s = os.path.getsize(path)
        ###自定義過濾 -s
        if '.psd' in path: return #字尾過濾示例
        if s<1024*1024*200:return#示例200M的大檔案
        ###自定義過濾-e
        if not (s in _size_map1.keys()):
            _size_map1[s] = {"list": [], "count": 0}
        _size_map1[s]["list"].append(path)
        _size_map1[s]["count"] += 1

#第二次根據大小進行分組
def fileFilter2():
    for k in _size_map1:
        i = _size_map1[k]
        if i["count"] > 1:
            for p in i["list"]:
                h=getFileMd5(p)
                if not (h in _size_map2.keys()):
                    _size_map2[h] = {"list": [], "count": 0,"size":k}
                _size_map2[h]["list"].append(p)
                _size_map2[h]["count"] += 1
                
#第三次過濾出分組數量大于1的,就當做是重複的
def fileFilter3():
    for k in _size_map2:
        i = _size_map2[k]
        if i["count"] > 1: 
            _size_map3[str(k)]=i
            
for p in _path:
    fileFilter1(p)
fileFilter2()
del _size_map1
fileFilter3()
del _size_map2
wrJson("./test.json",_size_map3)
print("---->over")
           

代碼簡單我就不詳細說明了..