Python實現清除文件夾中重復視頻

前言

在早期學Python的時候,買瞭一本《Python編程快速上手-讓繁瑣工作自動化》。

這本書裡面講得都比較基礎,不過卻非常的實用。

估計從書名大傢夥們就應該能體會到。

本次根據書中的「讀寫文件」章節內容,實現一個簡單又實用的小操作。

涉及到的模塊有os、hashlib、shutil。

利用這三個模塊實現對文件夾中的重復視頻進行清除,實現文件夾中無重復文件情況發生。

1.科普

在進行代碼操作前,簡單對相關知識做個簡單的學習。

畢竟我們不能停留在表象,要去明白它們的原理。

這樣才能做到舉一反三,提高學習效率。

二進制文件

二進制文件是以文本的二進制形式存儲在計算機中。

用戶一般不能直接讀取它們,需要通過相應的軟件才能將其顯示出來。

二進制文件一般是可執行程序、圖形、圖像、聲音等等。

本次實現的就是圖像類型的文件,即視頻!

摘要算法(MD5)

摘要算法又稱哈希算法、散列算法。

它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。

即通過摘要函數對任意長度的數據(data)計算出固定長度的摘要(digest)。

目的是為瞭發現原始數據是否被人篡改過。

摘要算法之所以能指出數據是否被篡改過,是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。

而且,對原始數據做一個bit的修改,都會導致計算出的摘要完全不同。

MD5是最常見的摘要算法,速度很快,生成結果是固定的128bit字節,通常用一個32位的16進制字符串表示。

摘要算法在很多地方都有廣泛的應用。

不過它並不是加密算法,不能用於加密(因為無法通過摘要反推明文),隻能用於防篡改。

它的單向計算特性決定瞭可以在不存儲明文口令的情況下驗證用戶口令。

其中Python的hashlib提供瞭常見的摘要算法,如MD5,SHA1等等。

本次文件夾中的視頻就是使用MD5摘要算法,得到視頻的摘要。

相當於給瞭視頻一個ID屬性,具備唯一性。

那麼通過比較視頻的摘要,便可以清除重復的視頻。

我們知道重復視頻的文件大小肯定是一樣的,那麼通過文件大小應該也是可以清除重復的視頻。

隻不過有時也會有不重復的視頻大小一樣的,畢竟視頻大小隻是個物理屬性,不具備唯一性。

shutil模塊

shutil是高級的文件,文件夾,壓縮包處理模塊。

shutil.copyfile(old, new),拷貝文件函數(就是復制的意思)。

2.視頻清除

以之前自動化獲取的抖音視頻為例。

共183個抖音視頻。

視頻全在一個文件夾裡

我新建瞭兩種文件夾,一種視頻全在一個文件夾裡的。

這種使用視頻大小作為篩選比較。

清除重復視頻代碼如下。

import os
import shutil

# 遞歸文件夾創建
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)
    # 如果不是重復視頻的話,大小應該和列表中數據不一樣
    if file_size not in size_list:
        # 獲取不重復視頻的大小
        size_list.append(file_size)
        # 獲取不重復視頻的路徑
        name_list.append(file_path)

# 使用shutil模塊的copyfile函數,復制文件到新的文件夾中去
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)實現視頻摘要獲取
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()

# 遞歸文件夾創建
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值應和列表中數據不一樣
        if value not in value_list:
            # 獲取不重復視頻的MD5值
            value_list.append(value)
            # 獲取不重復視頻的路徑
            name_list.append(file_path)

# 使用shutil模塊的copyfile函數,復制文件到新的文件夾中去
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實現清除文件夾中重復視頻的文章就介紹到這瞭,更多相關Python清除重復視頻內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: