用Python腳本清除文件夾中的重復(fù)視頻
/ 01 / 科普
在進(jìn)行代碼操作前,簡單對(duì)相關(guān)知識(shí)做個(gè)簡單的學(xué)習(xí)。
畢竟我們不能停留在表象,要去明白它們的原理。
這樣才能做到舉一反三,提高學(xué)習(xí)效率。
01 二進(jìn)制文件
二進(jìn)制文件是以文本的二進(jìn)制形式存儲(chǔ)在計(jì)算機(jī)中。
用戶一般不能直接讀取它們,需要通過相應(yīng)的軟件才能將其顯示出來。
二進(jìn)制文件一般是可執(zhí)行程序、圖形、圖像、聲音等等。
本次實(shí)現(xiàn)的就是圖像類型的文件,即視頻!
02 摘要算法(MD5)
摘要算法又稱哈希算法、散列算法。
它通過一個(gè)函數(shù),把任意長度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。
即通過摘要函數(shù)對(duì)任意長度的數(shù)據(jù)(data)計(jì)算出固定長度的摘要(digest)。
目的是為了發(fā)現(xiàn)原始數(shù)據(jù)是否被人篡改過。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過,是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù),計(jì)算f(data)很容易,但通過digest反推data卻非常困難。
而且,對(duì)原始數(shù)據(jù)做一個(gè)bit的修改,都會(huì)導(dǎo)致計(jì)算出的摘要完全不同。
MD5是最常見的摘要算法,速度很快,生成結(jié)果是固定的128bit字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。
摘要算法在很多地方都有廣泛的應(yīng)用。
不過它并不是加密算法,不能用于加密(因?yàn)闊o法通過摘要反推明文),只能用于防篡改。
它的單向計(jì)算特性決定了可以在不存儲(chǔ)明文口令的情況下驗(yàn)證用戶口令。
其中Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
本次文件夾中的視頻就是使用MD5摘要算法,得到視頻的摘要。
相當(dāng)于給了視頻一個(gè)ID屬性,具備唯一性。
那么通過比較視頻的摘要,便可以清除重復(fù)的視頻。
我們知道重復(fù)視頻的文件大小肯定是一樣的,那么通過文件大小應(yīng)該也是可以清除重復(fù)的視頻。
只不過有時(shí)也會(huì)有不重復(fù)的視頻大小一樣的,畢竟視頻大小只是個(gè)物理屬性,不具備唯一性。
03 shutil模塊
shutil是高級(jí)的文件,文件夾,壓縮包處理模塊。
shutil.copyfile(old, new),拷貝文件函數(shù)(就是復(fù)制的意思)。
/ 02 / 視頻清除
以之前自動(dòng)化獲取的抖音視頻為例。
共183個(gè)抖音視頻。
01?視頻全在一個(gè)文件夾里
我新建了兩種文件夾,一種視頻全在一個(gè)文件夾里的。
這種使用視頻大小作為篩選比較。
清除重復(fù)視頻代碼如下。
import?os
import?shutil
#?遞歸文件夾創(chuàng)建
folder_path?=?'F:/video/douyin_11'
os.makedirs(folder_path)
#?獲取文件夾里的文件名字符串列表
filenames?=?os.listdir('F:\video\douyin_1')
(size_list,?name_list)?=?([],?[])
for?name?in?filenames:
#?獲取文件的路徑
file_path?=?'F:\video\douyin_1\'?+?name
#?獲取文件的大小
file_size?=?os.path.getsize(file_path)
#?如果不是重復(fù)視頻的話,大小應(yīng)該和列表中數(shù)據(jù)不一樣
if?file_size?not?in?size_list:
#?獲取不重復(fù)視頻的大小
size_list.append(file_size)
#?獲取不重復(fù)視頻的路徑
name_list.append(file_path)
#?使用shutil模塊的copyfile函數(shù),復(fù)制文件到新的文件夾中去
num?=?0
for?filename?in?name_list:
num?+=?1
oldname=?filename
newname=?'F:\video\douyin_11\'?+?str(num)?+?'.mp4'
shutil.copyfile(oldname,?newname)
最后在新的文件夾中生成了183個(gè)視頻文件。
說明成功清除了重復(fù)的視頻文件。
02?視頻在不同的文件夾里
另一種視頻分為幾個(gè)部分,分別在不同文件夾下。
與上面不同的是,需要遍歷文件夾,然后再去遍歷文件夾中的文件。
另外使用摘要算法(MD5),生成視頻的特有ID,以此作為標(biāo)準(zhǔn)。
清除重復(fù)視頻代碼如下。
import?os
import?shutil
import?hashlib
#?摘要算法(MD5)實(shí)現(xiàn)視頻摘要獲取
def?getmd5(file_path):
#?判斷文件路徑是否存在及文件是否為一個(gè)文件,意思應(yīng)該是文件夾就會(huì)報(bào)錯(cuò)
if?not?os.path.isfile(file_path):
return
#?rb,以二進(jìn)制讀模式打開
vediofile?=?open(file_path,?'rb')
md5?=?hashlib.md5()
md5.update(vediofile.read())
vediofile.close()
#?返回視頻文件的MD5值
return?md5.hexdigest()
#?遞歸文件夾創(chuàng)建
folder_path?=?"F:/video/douyin_22"
os.makedirs(folder_path)
#?獲取文件夾里的文件夾名字符串列表
foldernames?=?os.listdir('F:\\video\\douyin_2')
(value_list,?name_list)?=?([],?[])
for?folder?in?foldernames:
#?獲取文件夾的路徑
folder_name?=?'F:\\video\\douyin_2\\'?+?folder
#?獲取文件夾里的文件名字符串列表
file_names?=?os.listdir(folder_name)
for?file_name?in?file_names:
#?獲取文件的路徑
file_path?=?folder_name?+?'\\'?+?file_name
#?獲取文件的MD5值
value?=?getmd5(file_path)
#?如果不是重復(fù)視頻的話,MD5值應(yīng)和列表中數(shù)據(jù)不一樣
if?value?not?in?value_list:
#?獲取不重復(fù)視頻的MD5值
value_list.append(value)
#?獲取不重復(fù)視頻的路徑
name_list.append(file_path)
#?使用shutil模塊的copyfile函數(shù),復(fù)制文件到新的文件夾中去
num?=?0
for?filename?in?name_list:
num?+=?1
oldname=?filename
newname=?'F:\\video\\douyin_22\\'?+?str(num)?+?'.mp4'
shutil.copyfile(oldname,?newname)
最后也在新的文件夾中生成了183個(gè)視頻文件。
說明也成功清除了重復(fù)的視頻文件。
/ 03 / 總結(jié)
試想一下如果你手動(dòng)去刪除這些重復(fù)的視頻,該有多浪費(fèi)時(shí)間。
這里也許你就能感受到了編程的樂趣了。
當(dāng)然其他文件,類似文本文檔、圖片、音頻,同樣可以利用Python進(jìn)行自動(dòng)化操作。
本文轉(zhuǎn)載自微信公眾號(hào)【java學(xué)習(xí)之道】。
爬蟲 python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。