在實際生活中,經常會有檔案重複的困擾,即同乙個檔案可能既在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
importos,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
importhashlib,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 importcreate_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():
"the duplicate file is %s
" %file[0]
"the original file is %s\n
" % file[1]
finddupes函式返回了字典dup,該字典的鍵是重複的檔案,值是原檔案。這樣就解答了很多人的疑惑,畢竟,你怎麼確保你輸出的是重複的檔案呢?
4. delete.py
importos,sys
class
deletefile(object):
def__init__
(self,file):
self.file=file
defdelete(self):
"deleting %s
" %self.file
os.remove(self.file)
defdryrun(self):
"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
:
"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...