Python實現(xiàn)清除文件夾中重復視頻
前言
在早期學Python的時候,買了一本《Python編程快速上手-讓繁瑣工作自動化》。
這本書里面講得都比較基礎,不過卻非常的實用。
估計從書名大家伙們就應該能體會到。
本次根據(jù)書中的「讀寫文件」章節(jié)內容,實現(xiàn)一個簡單又實用的小操作。
涉及到的模塊有os、hashlib、shutil。
利用這三個模塊實現(xiàn)對文件夾中的重復視頻進行清除,實現(xiàn)文件夾中無重復文件情況發(fā)生。
1.科普
在進行代碼操作前,簡單對相關知識做個簡單的學習。
畢竟我們不能停留在表象,要去明白它們的原理。
這樣才能做到舉一反三,提高學習效率。
二進制文件
二進制文件是以文本的二進制形式存儲在計算機中。
用戶一般不能直接讀取它們,需要通過相應的軟件才能將其顯示出來。
二進制文件一般是可執(zhí)行程序、圖形、圖像、聲音等等。
本次實現(xiàn)的就是圖像類型的文件,即視頻!
摘要算法(MD5)
摘要算法又稱哈希算法、散列算法。
它通過一個函數(shù),把任意長度的數(shù)據(jù)轉換為一個長度固定的數(shù)據(jù)串(通常用16進制的字符串表示)。
即通過摘要函數(shù)對任意長度的數(shù)據(jù)(data)計算出固定長度的摘要(digest)。
目的是為了發(fā)現(xiàn)原始數(shù)據(jù)是否被人篡改過。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過,是因為摘要函數(shù)是一個單向函數(shù),計算f(data)很容易,但通過digest反推data卻非常困難。
而且,對原始數(shù)據(jù)做一個bit的修改,都會導致計算出的摘要完全不同。
MD5是最常見的摘要算法,速度很快,生成結果是固定的128bit字節(jié),通常用一個32位的16進制字符串表示。
摘要算法在很多地方都有廣泛的應用。
不過它并不是加密算法,不能用于加密(因為無法通過摘要反推明文),只能用于防篡改。
它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。
其中Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
本次文件夾中的視頻就是使用MD5摘要算法,得到視頻的摘要。
相當于給了視頻一個ID屬性,具備唯一性。
那么通過比較視頻的摘要,便可以清除重復的視頻。
我們知道重復視頻的文件大小肯定是一樣的,那么通過文件大小應該也是可以清除重復的視頻。
只不過有時也會有不重復的視頻大小一樣的,畢竟視頻大小只是個物理屬性,不具備唯一性。
shutil模塊
shutil是高級的文件,文件夾,壓縮包處理模塊。
shutil.copyfile(old, new),拷貝文件函數(shù)(就是復制的意思)。
2.視頻清除
以之前自動化獲取的抖音視頻為例。

共183個抖音視頻。
視頻全在一個文件夾里
我新建了兩種文件夾,一種視頻全在一個文件夾里的。

這種使用視頻大小作為篩選比較。
清除重復視頻代碼如下。
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)
# 如果不是重復視頻的話,大小應該和列表中數(shù)據(jù)不一樣
if file_size not in size_list:
# 獲取不重復視頻的大小
size_list.append(file_size)
# 獲取不重復視頻的路徑
name_list.append(file_path)
# 使用shutil模塊的copyfile函數(shù),復制文件到新的文件夾中去
num = 0
for filename in name_list:
num += 1
oldname= filename
newname= 'F:\\video\\douyin_11\\' + str(num) + '.mp4'
shutil.copyfile(oldname, newname)最后在新的文件夾中生成了183個視頻文件。

說明成功清除了重復的視頻文件。
視頻在不同的文件夾里
另一種視頻分為幾個部分,分別在不同文件夾下。




與上面不同的是,需要遍歷文件夾,然后再去遍歷文件夾中的文件。
另外使用摘要算法(MD5),生成視頻的特有ID,以此作為標準。
清除重復視頻代碼如下。
import os
import shutil
import hashlib
# 摘要算法(MD5)實現(xiàn)視頻摘要獲取
def getmd5(file_path):
# 判斷文件路徑是否存在及文件是否為一個文件,意思應該是文件夾就會報錯
if not os.path.isfile(file_path):
return
# rb,以二進制讀模式打開
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)
# 如果不是重復視頻的話,MD5值應和列表中數(shù)據(jù)不一樣
if value not in value_list:
# 獲取不重復視頻的MD5值
value_list.append(value)
# 獲取不重復視頻的路徑
name_list.append(file_path)
# 使用shutil模塊的copyfile函數(shù),復制文件到新的文件夾中去
num = 0
for filename in name_list:
num += 1
oldname= filename
newname= 'F:\\video\\douyin_22\\' + str(num) + '.mp4'
shutil.copyfile(oldname, newname)最后也在新的文件夾中生成了183個視頻文件。

說明也成功清除了重復的視頻文件。
3.總結
試想一下如果你手動去刪除這些重復的視頻,該有多浪費時間。
這里也許你就能感受到了編程的樂趣了。
當然其他文件,類似文本文檔、圖片、音頻,同樣可以利用Python進行自動化操作。
到此這篇關于Python實現(xiàn)清除文件夾中重復視頻的文章就介紹到這了,更多相關Python清除重復視頻內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決已經安裝requests,卻依然提示No module named requests問題
今天小編就為大家分享一篇解決已經安裝requests,卻依然提示No module named 'requests'問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
通過python掃描二維碼/條形碼并打印數(shù)據(jù)
這篇文章主要介紹了通過python掃描二維碼/條形碼并打印數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
Python socket實現(xiàn)的簡單通信功能示例
這篇文章主要介紹了Python socket實現(xiàn)的簡單通信功能,結合實例形式分析了Python socket通信的相關概念、原理、客戶端與服務器端實現(xiàn)技巧以及socketserver模塊多并發(fā)簡單實現(xiàn)方法,需要的朋友可以參考下2018-08-08

