美文网首页
python3 编写超简单的重复文件扫描工具

python3 编写超简单的重复文件扫描工具

作者: 关爱单身狗成长协会 | 来源:发表于2018-07-05 13:03 被阅读400次

    参考我之前的文章(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")
    

    代码简单我就不详细说明了..

    相关文章

      网友评论

          本文标题:python3 编写超简单的重复文件扫描工具

          本文链接:https://www.haomeiwen.com/subject/abfpuftx.html