python 批量删除重复图片和其xml文件

最近有一批数据,大约10000多张图片吧,重复的很多,开始自己写了一个脚本删除重复图片和xml文件

开始之前发现一个同事的遗产里有此类型脚本,决定在此基础上修改,恩,菜鸡的开始之路,果然不能相信另一只菜鸡。

他的脚本就是一个冒泡双重循环下逐像素比较两张图片是否重复,真的慢到反正代码跑了一晚上10000多张图片还没遍历完

行吧,我更强不到那里去了,在他的基础上加了同时删除这张图片对应的xml文件,一张图片比较完就从list中删除,后来经人提醒开始不逐像素比较了

使用md5比较两张图片是否重复,但是这个双重循环遍历,不知道要跑到哪一年(我没有测试像素比较和md5比较哪个更快,反正在图片多的情况下都差不多相当于废物)

后来同事终于搜到网上大神写的脚本,秒秒钟跑完了,我太菜了,大神13年就写了这样的脚本,我果然是个废柴https://blog.csdn.net/frylion/article/details/8505385(大神脚本链接)

其原理是比较图片大小和md5结合来删除重复图片,比较大小已经完胜了我,现在的我才知道size = os.stat(real_path).st_size 这个size不是所谓的1920×1080图片的长宽

在图片比较上也不是那种傻循环,而是利用了字典此工具,大神就是大神啊

我自己的破脚本也粘一下吧,可以结合一下删除同名xml文件

# encoding: utf-8
"""
@author: Shang Tongtong
@contact: [email protected]
@time: 2019/9/4 下午1:34
@file: delete_same_pic_and_xml.py
@desc:
"""
import os
import cv2
import numpy as np
import hashlib

def get_token(pic):

    m1 = hashlib.md5()
    m1.update(pic)
    token = m1.hexdigest()
    return token

def find_the_same_pic(cwd, xml):
    for path, d, filelist in os.walk(cwd):
        filelist = sorted(filelist)
        filelist = filelist[600:]
        for imgname in filelist:
            if imgname.endswith(‘jpg‘):
                oldname1 = os.path.join(path, imgname)
                print(‘the old pic : ‘, oldname1)
                filelist.remove(imgname)
                img1 = cv2.imread(oldname1)
                #img1 = cv2.resize(img1, (540, 960))
                img1md5 = get_token(img1)
                for imgname1 in filelist:
                    if imgname1.endswith(‘jpg‘):
                        oldname2 = os.path.join(path, imgname1)
                        # print(oldname2)
                        img2 = cv2.imread(oldname2)
                        print(oldname2)
                        #img2 = cv2.resize(img2, (540, 960))
                        img2md5 = get_token(img2)
                        # img = img2 - img1
                        # a = max(sum(sum(img)))
                        result = (img1md5 == img2md5)
                        #result = not np.any(difference)

                        if result is True :
                            print(‘the_same : ‘, oldname1, oldname2)
                            rm_same_pic_and_xml(cwd, imgname1, xml)
                            filelist.remove(imgname1)

                        else:
                            pass
def rm_same_pic_and_xml(cwd, imgname, xml):
    xmlname = imgname.split(‘.‘)[0] + ‘.xml‘

    pic_file = os.path.join(cwd, imgname)
    xml_file = os.path.join(xml, xmlname)
    os.remove(pic_file)
    os.remove(xml_file)

if __name__ == ‘__main__‘:
    cwd = r‘/home/stt/data/tinghua/20190903/JPEGImages/‘

    xml = r‘/home/stt/data/tinghua/20190903/Annotations/‘

    find_the_same_pic(cwd, xml)

原文地址:https://www.cnblogs.com/stt-ac/p/11514309.html

时间: 2024-10-03 14:58:29

python 批量删除重复图片和其xml文件的相关文章

zencart批量删除无图片产品

zencart批量删除无图片产品,将以下代码保存为remove_products.php,放到网站根目录运行即可,操作前请先备份数据库. <?php require('includes/application_top.php'); $listing_sql = "select * from " .TABLE_PRODUCTS. " "; $listing = $db->Execute($listing_sql); while (!$listing->

Python 迭代删除重复项,集合删除重复项

1. 迭代删除重复项:先排序列表项,然后通过新迭代(not in)去除重复项,分片打印 def sanitize(time_string): if '-' in time_string: splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins, secs)=time_string.split(splitter) return(mins + '.' + secs) with op

Python批量删除指定文件夹下的指定类型的文件

Python作为一种脚本语言,其非常适合文件级的各种操作.下面的代码可以批量删除指定文件夹下的全部特定类型(CSV类型)的文件. import sys, csv , operator import os import glob for i in range(0, 20): path = "C:\\Python34\\Folder_" + str(i) for infile in glob.glob( os.path.join(path, '*.csv') ): os.remove(in

Python批量删除mysql中千万级大量数据

场景描述 线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多.运维找过来,磁盘占了200G,最后问了运营,可以只保留最近3天的,前面的数据,只能删了.删,怎么删? 因为这是线上数据库,里面存放有很多其它数据表,如果直接删除这张表的数据,肯定不行,可能会对其它表有影响.尝试每次只删除一天的数据,还是卡顿的厉害,没办法,写个Python脚本批量删除吧. 具体思路是: 每次只删除一天的数据: 删除一天的数据,每次删除50000条: 一天的数据删

python批量删除文件

写程序测试时总会碰到要删除日志文件夹下的日志或者删除一些历史文件,每次都会生成,再测试的时候为了查找错误原因方便总是要在测试前删除这些文件,手动删除比较麻烦,所以写一个批量删除脚本 import os def removeFileInFirstDir(targetDir): for file in os.listdir(targetDir): targetFile = os.path.join(targetDir, file) if os.path.isfile(targetFile): os.

使用Python批量下载网站图片

  在网上冲浪的时候,总有些"小浪花"令人喜悦.没错,小浪花就是美图啦.边浏览边下载,自然是不错的:不过,好花不常开,好景不常在,想要便捷地保存下来,一个个地另存为还是很麻烦的.能不能批量下载呢? 只要获得图片地址,还是不难的. 目标  太平洋摄影网, 一个不错的摄影网站. 如果你喜欢自然风光的话,不妨在上面好好饱览一顿吧.饱览一顿,或许你还想打包带走呢.这并不是难事,让我们顺藤摸瓜地来尝试一番吧(懒得截图,自己打开网站观赏吧). 首先,我们打开网址 http://dp.pconlin

Python批量读取人脸图片与数据互相转换

读取部分结果 程序 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from PIL import Image def ImagetoData(num=100): filename = 'face/face' data = [] for i in range(num): filename = 'face/face'+ str(i) + '.jpg' # 读取图片 im = Image.open(

Python 批量创建同文件名的特定类型文件

看了很多批量创建文件和文件批量格式转换的code,感觉杀鸡焉用牛刀,自己写了几行轻量级的拿来给大家参考: 在out_dir目录下批量创建与in_dir目录下同文件名但后缀不同的文件. in_dir = "D:\\data\\State_310000\\"out_dir = "D:\\data\\State_310000\\output\\"files = os.listdir(in_dir) for filename in files: filename_split

Python 批量创建同文件名的特定后缀文件

看了很多批量创建文件和文件批量格式转换的code,感觉杀鸡焉用牛刀,自己写了几行轻量级的拿来给大家参考: 在out_dir目录下批量创建与in_dir目录下同文件名但后缀不同的文件. in_dir = "D:\\data\\State_310000\\"out_dir = "D:\\data\\State_310000\\output\\"files = os.listdir(in_dir) for filename in files: filename_split