刪除重復圖片的軟件,由論壇大神原創(chuàng)制作的一個由Python編寫的刪除重復圖片程序,可以一鍵刪除文件中重復的圖片資源,為您的PC節(jié)省空間,同時整理你的圖庫。需要能刪除重復圖片的軟件的朋友們可以下載使用,單文件程序,綠色無廣告。
刪除重復圖片作者說明
今天閑來無事整理素材,發(fā)現(xiàn)有許多重復的圖片,由于數(shù)量太多無法手動翻閱刪除,想想寫個代碼,分析了一下重復圖片有些是同名的,有些內容重復不同名,返回文件名清理放棄,圖片大小也放棄放棄,后來選用計算MD5的方式清除,然后先是使用os.listdir()函數(shù)遍歷文件夾下的圖片,在測試過程中,如果文件夾下還包含文件夾就會引發(fā)異常,后來決定用os.walk()函數(shù)來遍歷;
源碼注釋寫的比較清晰,就不多闡述,可根據(jù)自己需要封裝函數(shù),制作成死循環(huán),添加退出條件,復用;
Python代碼一覽
import os,hashlib
import numpy as np
from PIL import Image,UnidentifiedImageError
from PIL.Image import DecompressionBombError
from rich import print
from time import time
print("""[#00CED1]待清理的文件夾內如果還包含了文件夾也同樣可以清理![/#00CED1][#0000FF]
@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@@@ @@@ @@@ @@@ @@@@@@ @@@ @@@ @@@ @@@
@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@ @@@ @@@@ @@@
@@! @@! @@@ @@! @@@ @@! @@@ @@! @@@ @@! @@! @@@ @@! @@@ @@! @@! @@!@!@@@
!@! !@! @!@ !@! @!@ !@! @!@ !@! @!@ !@! !@! @!@ !@! @!@ !@! !@! !@!!@!@!
@!!!:! @!@ !@! @!@!@!@! @!@ !@! @!@!@!@! @!! @!@ !@! @!@ !@! !!@ !!@ @!@ !!@!
!!!!!: !@! !!! !!!@!!!! !@! !!! !!!@!!!! !!! !@! !!! !@! !!! !!! !!! !@! !!!
!!: !!: !!! !!: !!! !!: !!! !!: !!! !!: !!: !!! !!: !!! !!: !!: !!: !!!
:!: :!: !:! :!: !:! :!: !:! :!: !:! :!: :!: !:! :!: !:! !!: :!: :!: :!: !:!
:: ::::: :: :: ::: ::::: :: :: ::: :: :::: ::::: :: ::::: :: ::: : :: :: :: ::
: : : : : : : : : : : : : : :: : : : : : : : : : ::: : :: :
[/#0000FF] [#00CED1]待清理的文件夾內還包含文件夾也可清理![/#00CED1]""")
path = input(r"輸入圖片文件夾路徑,例如 D:\python\tupian:")
try:
file = os.walk(path) # 遍歷目錄;
except FileNotFoundError: # 捕獲路徑不存在異常;
print('抱歉,沒有這個路徑!')
else:
temp = set() # 創(chuàng)建臨時集合;
del_count = 0 # 刪除圖片計數(shù);
pass_count = 0 # 非圖片計數(shù);
file_count = 0 # 總文件計數(shù);
time1 = time()
for path_name, dir_name, file_name in file: # 遍歷walk返回3個元素;
for n in file_name: # 獲得每個文件名字;
full_path = os.path.join(path_name, n) # 拼接路徑和文件名,獲得文件完整路徑;
file_count += 1 # 文件計數(shù)+1;
print(full_path)
try:
with Image.open(full_path) as t: # 打開圖片;
array = np.array(t) # 轉為數(shù)組;
except (UnidentifiedImageError,DecompressionBombError): # 捕獲不是圖片,像素炸彈異常;
pass_count += 1 # 非圖片計數(shù)+1;
pass
else:
md5 = hashlib.md5() # 創(chuàng)建MD5對象;
md5.update(array) # 獲取當前圖片MD5;
if md5.hexdigest() not in temp: # 如果哈希值沒有在集合中;
temp.add(md5.hexdigest()) # 就把哈希值添加到集合中;
else:
os.remove(full_path) # 如果在集合中就刪除當前圖片;
print(full_path+'------------------已刪除')
del_count += 1 # 刪除計數(shù)+1;
time2 = time()
time3 = time2-time1
if pass_count != 0:
print('[#7CFC00]非圖片數(shù)據(jù):[/#7CFC00][#800000]{0}[/#800000] 個.'.format(pass_count))
print('[#800080]一共讀取圖片:[/#800080][#800000]{0}[/#800000] 張.'.format(file_count - pass_count))
print('[#3CB371]刪除重復圖片:[/#3CB371][#800000]{0}[/#800000] 張.'.format(del_count))
print('[#0000FF]總耗時為:[/#0000FF][#800000]{:.4f}[/#800000] 秒.'.format(time3))
input('按任意鍵結束!!!') # 此條為了編譯成EXE或在命令行運行腳本時能看見上面統(tǒng)計后數(shù)據(jù)所添加,如果在IDE中運行可刪除;
exit() # 如果在IDE中運行可刪除;