21.11 Python 使用CRC图片去重
使用CRC32还可实现图片去重功能,如下FindRepeatFile函数,运行后通过对所有文件做crc校验并将校验值存储至CatalogueDict字典内,接着依次提取CRC特征值并将其存储至CatalogueList列表内,接着通过统计特征值出现次数并将该次数放入到CountDict字典内,最后循环这个字典,并以此输出文件特征与重复次数,将重复值放入到RepeatFileFeatures列表内。
如下代码所示;
import zlib,os
def Find_Repeat_File(file_path,file_type):
    Catalogue = os.listdir(file_path)
    CatalogueDict = {}  # 查询字典,方便后期查询键值对对应参数
    for each in Catalogue:
        path = (file_path + each)
        if os.path.splitext(path)[1] == file_type:
            with open(path,"rb") as fp:
                crc32 = zlib.crc32(fp.read())
                # print("[*] 文件名: {} CRC32校验: {}".format(path,str(crc32)))
                CatalogueDict[each] = str(crc32)
    CatalogueList = []
    for value in CatalogueDict.values():
    # 该过程实现提取字典中的crc32特征组合成列表 CatalogueList
        CatalogueList.append(value)
    CountDict = {}
    for each in CatalogueList:
    # 该过程用于存储文件特征与特征重复次数,放入 CountDict
        CountDict[each] = CatalogueList.count(each)
    RepeatFileFeatures = []
    for key,value in CountDict.items():
    # 循环查找字典中的数据,如果value大于1就存入 RepeatFileFeatures
        if value > 1:
            print("[-] 文件特征: {} 重复次数: {}".format(key,value))
            RepeatFileFeatures.append(key)
if __name__ == "__main__":
    Find_Repeat_File("D://lyshark/",".png")
运行上述代码,则会扫描d://lyshark/目录下所有的png格式文件,并输出这些文件特征值,以及该特征的重复次数,如下图所示;

有了上述方法我们就可以实现去重了,当然上述方法还可以优化,通过使用groupby功能可以自动实现分组,f恩组后我们只需要对分组进行排序,并寻找对应符合条件的特征,找到后直接调用os.remove将其移除即可,实现代码如下所示;
import zlib,os,argparse
from operator import itemgetter
from itertools import groupby
def Find_Repeat_File(file_path,file_type):
    Catalogue = os.listdir(file_path)
    CatalogueList = []
    for each in Catalogue:
        path = (file_path + each)
        if os.path.splitext(path)[1] == file_type:
            with open(path,"rb") as fp:
                crc32 = zlib.crc32(fp.read())
                # print("[*] 文件名: {} CRC32校验: {}".format(path,str(crc32)))
                CatalogueList.append({ "CRC32": str(crc32) , "FILE": path })
    # 首先排序,然后根据字典中的CRC32排序
    CatalogueList.sort(key=itemgetter("CRC32"))
    for key,value in groupby(CatalogueList,key=itemgetter("CRC32")):
        # print("[*] CRC32特征码: {}\t".format(key))
        for each in value:
            RepeatNumber = len(list(value))
            if (RepeatNumber+1) > 1:
                try:
                    print("---> 重复图片: {} 已移除".format(each.values()))
                    os.remove(str(list(each.values())[1]))
                except FileNotFoundError:
                    pass
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-d","--dirs",dest="dirs",help="指定目录路径")
    parser.add_argument("-t","--types",dest="types",help="指定文件类型")
    args = parser.parse_args()
    # 使用方式: main.py -d "d://lyshark/" -t ".png"
    if args.dirs and args.types:
        os.chdir(args.dirs)
        try:
            for each in range(0,len(os.listdir())):
                Find_Repeat_File("./",args.types)
        except:
            pass
    else:
        parser.print_help()
如下图所示,我们通过传入d://lyshark/并设置.png类型,扫描该目录下所有重复文件,并将该文件移除,输出效果如下图所示;

当然上述方法是一次性清楚重复文件,在某些时候我们希望存入文件后自动清理,此时就需要动态监控文件或目录变化,函数MonitoringDirectory()可用于动态监控用户目录,当有新文件创建时自动校验是否存在该文件如果存在则删除重复的,其实现原理是不间断的遍历目录,当有新文件产生时自动将该文件计算特征对比,如果重复则删除,该方式虽然可实现目录监控但效率却很低,因为要不间断的遍历目录。
import os, time
from zlib import crc32
# 计算目标CRC32
def Calculation_crc32(filename):
    try:
        with open(filename,"rb") as fp:
            crc = crc32(fp.read())
            while True:
                temp = fp.read(8196)
                if not temp:
                    break
            fp.close()
            return crc
    except Exception:
        fp.close()
        return 0
    return 0
# 开始监控目录
def MonitoringDirectory(path_to_watch):
    crc_poll = []
    before = dict([(f, None) for f in os.listdir(path_to_watch)])
    while True:
        time.sleep (0.3)
        after = dict ([(f, None) for f in os.listdir (path_to_watch)])
        added = [f for f in after if not f in before]
        removed = [f for f in before if not f in after]
        # 新增文件时触发
        if added:
            # print("新建文件: {}".format(added))
            for index in range(0,len(added)):
                # 计算文件CRC32
                AbsolutePath = path_to_watch + "/" + added[index]
                crc = Calculation_crc32(AbsolutePath)
                print(f"计算文件路径: {AbsolutePath} 文件CRC32: {crc}")
                # 只要有新文件则加入到crc_pool
                if crc != 0:
                    crc_poll.append(crc)
                print("池内数据: {}".format(crc_poll))
                crc_count = 0
                # 循环池内的所有CRC数据
                for index in range(0,len(crc_poll)):
                    # 如果当前文件CRC与池内某个一致则递增
                    if crc_poll[index] == crc:
                        crc_count = crc_count + 1
                    # 只要大于2则说明有重复的
                    if crc_count >= 2:
                        try:
                            print("存在校验值,删除文件: {}".format(AbsolutePath))
                            os.remove(AbsolutePath)
                            crc_poll.remove(crc)
                        except Exception:
                            pass
        # 删除文件时触发
        if removed:
            print("移除文件: {}".format(removed))
        before = after
if __name__ == "__main__":
    MonitoringDirectory("d://lyshark")
运行上述程序,则会监控d://lyshark目录,当有心文件被创建时会自动对比特征值,如果相同则会被清理,如果无重复的则会被保留,如下图所示;

21.11 Python 使用CRC图片去重的更多相关文章
- python爬取妹子图全站全部图片-可自行添加-线程-进程爬取,图片去重
		from bs4 import BeautifulSoupimport sys,os,requests,pymongo,timefrom lxml import etreedef get_fenlei ... 
- 2016年12月16日 星期五 --出埃及记 Exodus 21:11
		2016年12月16日 星期五 --出埃及记 Exodus 21:11 If he does not provide her with these three things, she is to go ... 
- python 将png图片格式转换生成gif动画
		先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ... 
- Python人工智能之图片识别,Python3一行代码实现图片文字识别
		1.Python人工智能之图片识别,Python3一行代码实现图片文字识别 2.tesseract-ocr安装包和中文语言包 注意: 
- python使用set来去重碰到TypeError: unhashable type
		新版:Python 的 unhashable type 错误分析及解决 python使用set来去重是一种常用的方法. 一般使用方法如下: # int a = [1, 2, 3, 4, 5, 1, 2 ... 
- PostgreSQL视频去重 图片去重系列1
		PostgreSQL 在视频.图片去重,图像搜索业务中的应用 图片搜索 PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储 gist 索引方法(支持pa ... 
- Python批量修改图片格式和尺寸
		Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ... 
- 21行python代码实现拼写检查器
		引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供很好的拼写检查,比方你输入 speling,谷歌会立即返回 spelling. 前几天,看到http://norvig.com/spe ... 
- Python 实现简单图片验证码登录
		朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ... 
- PostgreSQL 在视频、图片去重,图像搜索业务中的应用
		摘要: PostgreSQL 在视频.图片去重,图像搜索业务中的应用作者digoal日期2016-11-26标签PostgreSQL , Haar wavelet , 图像搜索 , 图片去重 , 视频 ... 
随机推荐
- Grafana--添加用户
			版本:6.5.2 添加用户: 设置账号密码: 设置账号权限(新增的用户都是仅查看的权限): 
- Modern C++ Starter Kits Share
			初入 C++ 搬砖,在团队中开发实际上很少亲自从零开始搭建C++的完整项目,99%时候都是使用基础架构团队或者CI/CD团队搭建好的框架.这里分享几个配置C++项目的模版,它们一般会涉及三方库管理.格 ... 
- 如何优雅的在 Word 中添加漂亮的代码?
			Step 01 第一步,在编程软件里找到你想要放进Word文档里的代码,复制下来. Step 02 第二步,打开Notepad++,将代码直接粘贴. Step 03 第三步,这个时候的代码是没有任何格 ... 
- 打破监控壁垒,棉花厂3D可视化建设让生产加工更加智能化
			前言 现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加下厂的设备突然出现故障时,控制程序需要更换.这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再 ... 
- CommonJS 和 ES6 Module 究竟有什么区别?
			https://juejin.im/post/5e5f10176fb9a07cd443c1e2 
- C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别
			刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype() 识别值类别:lvalue glvalue xvalue rvalue prvalue.依照博客的方法试了一下,发现根本行不通. ... 
- 通过 Feign 进行文件上传
			转载请注明出处: 项目为spring cloud 项目,项目中对各部分能力业务进行了拆分,将公共的服务能力放在一个模块当中,通过 Feign 的方式 进行调用,feign 调用的本质还是http内部通 ... 
- 【ThreadX-NetX Duo】Azure RTOS NetX Duo概述
			Azure RTOS NetX Duo嵌入式TCP / IP网络堆栈是Microsoft高级的工业级双IPv4和IPv6 TCP / IP网络堆栈,专门为深度嵌入式,实时和IoT应用程序设计.NetX ... 
- 【java】 向上转型的运用
			应用 :求面积 1,抽象类 Geometry . public abstract class Geometry { public abstract double getArea(); } 2,矩形 ... 
- 银河麒麟上面 ntopng的安装与使用
			银河麒麟上面 ntopng的安装与使用 背景 一直想用Grafana监控网络流量 但是断断续续尝试了一周的时间都没有搞定. 发现这一块已经进入了瓶颈. 比较无奈的情况下回到了原来的iftop/iptr ... 
