【python辦公自動化】指定路徑下重複內容文件的刪除(文件唯一性檢驗)


手動反爬蟲:原博地址

 知識梳理不易,請尊重勞動成果,文章僅發佈在CSDN網站上,在其他網站看到該博文均屬於未經作者授權的惡意爬取信息

1. 背景需求

有時使用相機把拍攝的照片上傳到電腦裏,但是會由於相片的數量很多,導致之前上傳的照片可能多次上傳了,而現在的每張照片的內存都很大,因此就有了一個需要:把指定路徑下(比如上傳照片的根文件夾裏)所有的照片進行重複內容的刪除,只保留一張有效的照片。
在這裏插入圖片描述
比如上面的三張圖片實際上是同一張照片,但是文件名稱和文件的格式是不同的,最後處理的結果要求是隻保留一張圖片即可。同樣的場景需求也適用在重複文件(比如word、excel、pdf、txt等)中

2. hash函數

hash()函數是python內置的函數,用於獲取取一個對象(字符串或者數值 等)的哈希值。這裏可以使用此方法進行文件的唯一性檢驗

2.1 字符串及數值一致性檢驗

'''文字的一致性'''
text1 = '這是一個文本'
text2 = '這是第二個文本'
text3 = '這是一個文本'
print(hash(text1))
print(hash(text2))
print(hash(text3))

'''數值的一致性'''
num1 = 123
num2 = 123
string = 123
print(hash(num1))
print(hash(num2))
print(hash(string))

→ 輸出的結果爲:(第一個和第三種字符串的內容是一致的,對應的hash值也是一致的,但每次運行時這個數值會發生變化,數值的hash還是其本身)

1229837675
-852478554
1229837675

123
123
123

2.2 txt文本文件一致性檢驗

基於上面的示例,這裏三個文本文件裏面的內容分別對應上面的三個文字內容,也就是第一個和第三個內容一致

text1 = open('text1.txt','rb').read()
text2 = open('text2.txt','rb').read()
text3 = open('text3.txt','rb').read()
print(hash(text1))
print(hash(text2))
print(hash(text3))

→ 輸出的結果爲:(選擇’rb’是因爲方便只有的圖片文件的讀入)

-990985735711021081
2825019775363907335
-990985735711021081

2.3 照片文件一致性檢驗

照片文件需要使用二進制的形式進行讀取,所以採用’rb’

jpg1 = open('1.jpg','rb').read()
jpg2 = open('2.jpg','rb').read()
jpg3 = open('3.png','rb').read()
print(hash(jpg1))
print(hash(jpg2))
print(hash(jpg3))

→ 輸出的結果爲:(從結果可以看出,雖然圖片的命名個格式不同,但是三張圖片的內容實際上是一樣的)

-4435124486000804078
-4435124486000804078
-4435124486000804078

基於此,對於word、excel、pdf等文件也是同理了,這些文件就不再進行一一的檢驗了,下面直接進行實操

3. 項目實操

這裏準備的一個demo文件夾,初始文件夾內容如下
在這裏插入圖片描述
拆分:然後該文件夾和子文件夾下面都各有每一類文件一個(比如含有後綴1的都在1文件夾下,含有2的都在2文件夾下,含有3的就在3文件夾下),如下
在這裏插入圖片描述
注意: 除了三張照片是一模一樣的,其餘的各類文件都是3箇中只有兩個是一樣的,所以最後篩選的文件一共有9份(1份圖片,2份txt,2份word,2份excel,2份pdf)

查看指定文件夾下的文件,和其對應文件內容的hash
在這裏插入圖片描述

4. 全部代碼

如下,需要自動化辦公3中講到的文件遍歷、判斷和刪除的方法,主要是根據文件內容的hash值進行文件的唯一性檢驗。

import os

hash_ls = []
for dirpath,dirnames,files in os.walk('./demo/1'):
    #print(dirpath)
    for file in os.scandir(dirpath):
        if file.is_file():
            content = open(file, 'rb').read()
            if hash(content) not in hash_ls:
                hash_ls.append(hash(content))
            else:
                os.remove(file)
print(len(hash_ls))

代碼核心思想: 就是最初創建個空列表,先把文件對應的hash值放置在列表中(文件和其hash值是一一對應的關係),依次進行循環,如果遇到重複的hash值,就把其對應的文件給刪除,這樣就保留了唯一的文件(最先遍歷到的文件保留下來了,就對應上結果,1文件夾中的文件全部保留)

→ 輸出的結果爲:(最後的文件數量即爲9)
在這裏插入圖片描述
最後的文件夾中的內容如下:(1文件夾中自然一個文件不會少)
在這裏插入圖片描述
2文件夾下面重複的內容被刪除,只有三個文件
在這裏插入圖片描述
最後3文件夾,只剩下一個文件
在這裏插入圖片描述
最後算起來就是1張圖片,2份word,2份txt,2份excel和2份pdf文件,和最初文件判斷的一致,也就滿足了指定路徑下重複內容文件的刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章