Python實(shí)現(xiàn)清除文件夾中重復(fù)視頻
前言
在早期學(xué)Python的時(shí)候,買了一本《Python編程快速上手-讓繁瑣工作自動(dòng)化》。
這本書里面講得都比較基礎(chǔ),不過卻非常的實(shí)用。
估計(jì)從書名大家伙們就應(yīng)該能體會(huì)到。
本次根據(jù)書中的「讀寫文件」章節(jié)內(nèi)容,實(shí)現(xiàn)一個(gè)簡(jiǎn)單又實(shí)用的小操作。
涉及到的模塊有os、hashlib、shutil。
利用這三個(gè)模塊實(shí)現(xiàn)對(duì)文件夾中的重復(fù)視頻進(jìn)行清除,實(shí)現(xiàn)文件夾中無(wú)重復(fù)文件情況發(fā)生。
1.科普
在進(jìn)行代碼操作前,簡(jiǎn)單對(duì)相關(guān)知識(shí)做個(gè)簡(jiǎn)單的學(xué)習(xí)。
畢竟我們不能停留在表象,要去明白它們的原理。
這樣才能做到舉一反三,提高學(xué)習(xí)效率。
二進(jìn)制文件
二進(jìn)制文件是以文本的二進(jìn)制形式存儲(chǔ)在計(jì)算機(jī)中。
用戶一般不能直接讀取它們,需要通過相應(yīng)的軟件才能將其顯示出來(lái)。
二進(jìn)制文件一般是可執(zhí)行程序、圖形、圖像、聲音等等。
本次實(shí)現(xiàn)的就是圖像類型的文件,即視頻!
摘要算法(MD5)
摘要算法又稱哈希算法、散列算法。
它通過一個(gè)函數(shù),把任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。
即通過摘要函數(shù)對(duì)任意長(zhǎng)度的數(shù)據(jù)(data)計(jì)算出固定長(zhǎng)度的摘要(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(wú)法通過摘要反推明文),只能用于防篡改。
它的單向計(jì)算特性決定了可以在不存儲(chǔ)明文口令的情況下驗(yàn)證用戶口令。
其中Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
本次文件夾中的視頻就是使用MD5摘要算法,得到視頻的摘要。
相當(dāng)于給了視頻一個(gè)ID屬性,具備唯一性。
那么通過比較視頻的摘要,便可以清除重復(fù)的視頻。
我們知道重復(fù)視頻的文件大小肯定是一樣的,那么通過文件大小應(yīng)該也是可以清除重復(fù)的視頻。
只不過有時(shí)也會(huì)有不重復(fù)的視頻大小一樣的,畢竟視頻大小只是個(gè)物理屬性,不具備唯一性。
shutil模塊
shutil是高級(jí)的文件,文件夾,壓縮包處理模塊。
shutil.copyfile(old, new),拷貝文件函數(shù)(就是復(fù)制的意思)。
2.視頻清除
以之前自動(dòng)化獲取的抖音視頻為例。
共183個(gè)抖音視頻。
視頻全在一個(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ù)的視頻文件。
視頻在不同的文件夾里
另一種視頻分為幾個(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ù)的視頻文件。
3.總結(jié)
試想一下如果你手動(dòng)去刪除這些重復(fù)的視頻,該有多浪費(fèi)時(shí)間。
這里也許你就能感受到了編程的樂趣了。
當(dāng)然其他文件,類似文本文檔、圖片、音頻,同樣可以利用Python進(jìn)行自動(dòng)化操作。
到此這篇關(guān)于Python實(shí)現(xiàn)清除文件夾中重復(fù)視頻的文章就介紹到這了,更多相關(guān)Python清除重復(fù)視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)獲取當(dāng)前日期的所屬信息
在Python中,處理日期和時(shí)間是一個(gè)常見的任務(wù),它涉及到許多方面,例如獲取日期的年、月、日、星期幾等等,本文將詳細(xì)介紹如何使用Python來(lái)獲取當(dāng)前日期的各種相關(guān)信息,需要的可以了解下2024-01-01Python中常見的反爬機(jī)制及其破解方法總結(jié)
今天給大家?guī)?lái)的文章是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python中常見的反爬機(jī)制及其破解方法展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06python基于itchat模塊實(shí)現(xiàn)微信防撤回
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)微信防撤回,基于itchat模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Python+unittest+requests+excel實(shí)現(xiàn)接口自動(dòng)化測(cè)試框架
這篇文章主要介紹了Python+unittest+requests+excel實(shí)現(xiàn)接口自動(dòng)化測(cè)試框架,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python實(shí)現(xiàn)無(wú)證書加密解密實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)無(wú)證書加密解密的方法,實(shí)例講述了無(wú)證書加密解密的原理與具體實(shí)現(xiàn)過程,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10