如何用Python尋找重複檔案並刪除

2021-09-06 22:10:31 字數 3334 閱讀 7250

在實際生活中,經常會有檔案重複的困擾,即同乙個檔案可能既在a目錄中,又在b目錄中,更可惡的是,即便是同乙個檔案,檔名可能還不一樣。在檔案較少的情況下,該類情況還比較容易處理,最不濟就是one by one的人工比較——即便如此,也很難保證你的眼神足夠犀利。倘若檔案很多,這豈不是個impossible mission?最近在看《python unix和linux系統管理指南》,裡面就有有關「資料比較」的內容,在其基礎上,結合實際整理如下。

該指令碼主要包括以下模組:diskwalk,chechsum,find_dupes,delete。其中diskwalk模組是遍歷檔案的,給定路徑,遍歷輸出該路徑下的所有檔案。chechsum模組是求檔案的md5值。find_dupes匯入了diskwalk和chechsum模組,根據md5的值來判斷檔案是否相同。delete是刪除模組。具體如下:

1. diskwalk.py

import

os,sys

class

diskwalk(object):

def__init__

(self,path):

self.path =path

defpaths(self):

path=self.path

path_collection=

for dirpath,dirnames,filenames in

os.walk(path):

for file in

filenames:

fullpath=os.path.join(dirpath,file)

return

path_collection

if__name__ == '

__main__':

for file in diskwalk(sys.argv[1]).paths():

print file

2. chechsum.py

import

hashlib,sys

defcreate_checksum(path):

fp =open(path)

checksum =hashlib.md5()

while

true:

buffer = fp.read(8192)

ifnot buffer:break

checksum.update(buffer)

fp.close()

checksum =checksum.digest()

return

checksum

if__name__ == '

__main__':

create_checksum(sys.argv[1])

3. find_dupes.py

from checksum import

create_checksum

from diskwalk import

diskwalk

from os.path import

getsize

import

sysdef

finddupes(path):

record ={}

dup ={}

d =diskwalk(path)

files =d.paths()

for file in

files:

compound_key =(getsize(file),create_checksum(file))

if compound_key in

record:

dup[file] =record[compound_key]

else

: record[compound_key]=file

return

dupif

__name__ == '

__main__':

for file in finddupes(sys.argv[1]).items():

print

"the duplicate file is %s

" %file[0]

print

"the original file is %s\n

" % file[1]

finddupes函式返回了字典dup,該字典的鍵是重複的檔案,值是原檔案。這樣就解答了很多人的疑惑,畢竟,你怎麼確保你輸出的是重複的檔案呢?

4. delete.py

import

os,sys

class

deletefile(object):

def__init__

(self,file):

self.file=file

defdelete(self):

print

"deleting %s

" %self.file

os.remove(self.file)

defdryrun(self):

print

"dry run: %s [not deleted]

" %self.file

definteractive(self):

answer=raw_input("

do you really want to delete: %s [y/n]

" %self.file)

if answer.upper() == 'y'

: os.remove(self.file)

else

:

print

"skiping: %s

" %self.file

return

if__name__ == '

__main__':

from find_dupes import

finddupes

dup=finddupes(sys.argv[1])

for file in

dup.iterkeys():

delete=deletefile(file)

#delete.dryrun()

delete.interactive()

#delete.delete()

deletefile類構造了3個函式,實現的都是檔案刪除功能、其中delete函式是直接刪除檔案,dryrun函式是試執行,檔案並沒有刪除,interactive函式是互動模式,讓使用者來確定是否刪除。這充分了考慮了客戶的需求。

總結:這四個模組已封裝好,均可單獨使用實現各自的功能。組合起來就可批量刪除重複檔案,只需輸入乙個路徑。

如何用Python 加密檔案

生活中,有時候我們需要對一些重要的檔案進行加密,python 提供了諸如 hashlib,base64 等便於使用的加密庫。但對於日常學習而言,我們可以借助異或操作,實現乙個簡單的檔案加密程式,從而強化自身的程式設計能力。基礎知識 在 python 中異或操作符為 也可以記作 xor。xbczzsz...

python開啟檔案 如何用Python讀寫檔案

前面我們已經介紹了很多python相關的基礎知識,大家是不是對python已經有了進一步認識了呢?作為人工智慧時代的熱門程式語言,開始接觸並學習python的孩子越來越多,家長們都不想讓自己的孩子落於人後,近期前來找陳老師諮詢相關課程的人不少。今天和大家說說如何用python操作乙個檔案的內容,一起...

如何用Python合併lmdb檔案

由於caffe使用的儲存影象的資料庫是lmdb,因此有時候需要對lmdb檔案進行操作,本文主要講解如何用python合併lmdb檔案。沒有lmdb支援的,需要用pip命令安裝。pip install lmdb 及注釋如下 coding utf 8 filename merge lmdb.py imp...