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