參考我之前的文章( 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")
代碼簡單我就不詳細說明了..