script now searches subdirectories too #1

This commit is contained in:
root 2022-10-24 13:01:54 +02:00
parent 1d209cc69c
commit e7f7ecd2b7

View File

@ -4,10 +4,10 @@ import os
import numpy as np import numpy as np
import csv import csv
def writeCSV(dirname, i1, i2): def writeCSV(i1, i2):
with open("duplicates.csv", "a") as file: with open("duplicates.csv", "a") as file:
writer = csv.writer(file, delimiter=',') writer = csv.writer(file, delimiter=',')
writer.writerow([dirname+i1, dirname+i2]) writer.writerow([i1, i2])
class DuplicateRemover: class DuplicateRemover:
extensions = ['png', 'jpg', 'jpeg', 'gif', 'webp'] extensions = ['png', 'jpg', 'jpeg', 'gif', 'webp']
@ -20,26 +20,27 @@ class DuplicateRemover:
Find and Delete Duplicates Find and Delete Duplicates
""" """
fnames = os.listdir(self.dirname) #fnames = os.listdir(self.dirname)
hashes = {} hashes = {}
duplicates = [] duplicates = []
if verbose: if verbose:
print("Finding Duplicates Now!\n") print("Finding Duplicates Now!\n")
for path, subdirs, fnames in os.walk(self.dirname):
for image in fnames: for image in fnames:
if list(image.lower().split('.'))[-1] in self.extensions: if list(image.lower().split('.'))[-1] in self.extensions:
try: try:
with Image.open(os.path.join(self.dirname,image)) as img: with Image.open(os.path.join(path,image)) as img:
temp_hash = imagehash.average_hash(img, self.hash_size) temp_hash = imagehash.average_hash(img, self.hash_size)
if temp_hash in hashes: if temp_hash in hashes:
if verbose: if verbose:
print("Duplicate {} \nfound for Image {}!\n".format(image,hashes[temp_hash])) print("Duplicate {} \nfound for Image {}!\n".format(os.path.join(path,image),os.path.join(path,hashes[temp_hash])))
if exportCSV: if exportCSV:
writeCSV(self.dirname, image, hashes[temp_hash]) writeCSV(os.path.join(path,image), os.path.join(path,hashes[temp_hash]))
duplicates.append(image) duplicates.append(os.path.join(path,image))
else: else:
hashes[temp_hash] = image hashes[temp_hash] = os.path.join(path,image)
except Exception as error: except Exception as error:
print("Error: The following error occured:\n",image,"\n",error,"\n") print("Error: The following error occured:\n",os.path.join(path,image),"\n",error,"\n")
if len(duplicates) != 0: if len(duplicates) != 0:
if verbose: if verbose:
@ -49,9 +50,9 @@ class DuplicateRemover:
space_saved = 0 space_saved = 0
if(a.strip().lower() == "y"): if(a.strip().lower() == "y"):
for duplicate in duplicates: for duplicate in duplicates:
space_saved += os.path.getsize(os.path.join(self.dirname,duplicate)) space_saved += os.path.getsize(duplicate)
os.remove(os.path.join(self.dirname,duplicate)) os.remove(duplicate)
if verbose: if verbose:
print("{} Deleted Succesfully!".format(duplicate)) print("{} Deleted Succesfully!".format(duplicate))