参考我之前的文章(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")
代码简单我就不详细说明了..