一 點睛
當我們進行**審計或校驗備份結果時,往往需要檢查原始與目標目錄的檔案一致性,python的標準庫已經自帶了滿足此需求的模組 filecmp。filecmp可以實現檔案、目錄、遍歷子目錄的差異對比功能。比如報告中輸出目標目錄比原始多出的檔案或子目錄,即使檔案同名也會判斷是否為同乙個檔案(內容級對比)等,python 2.3或更高版本預設自帶filecmp模組,無需額外安裝。
filecmp提供了三個操作方法,分別為cmp(單檔案對比)、 cmpfiles(多檔案對比)、dircmp(目錄對比)。
二 單檔案對比
採用filecmp.cmp(f1,f2[,shallow])方法,比較檔名為f1和f2的檔案,相同返回true,不相同返回false,shallow預設為 true,意思是只根據os.stat()方法返回的檔案基本資訊進行對比,比如最後訪問時間、修改時間、狀態改變時間等,會忽略檔案內容的對比。當shallow為false時,則os.stat()與檔案內容同時進行校驗。
>>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f3")
true
>>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f2")
false
三 多檔案對比採用filecmp.cmpfiles(dir1,dir2,common[, shallow])方法,對比dir1與dir2目錄給定的檔案清單。該方法返回檔名的三個列表,分別為匹配、不匹配、錯誤。匹配為包含匹配的檔案的列表,不匹配反之,錯誤列表包括了目錄不存在檔案、不具備讀許可權或其他原因導致的不能比較的檔案清單。
我們構造兩個目錄中的f1、f2、f3檔案相同,f4和f5檔案不同。
>>> filecmp.cmpfiles("dir1","dir2",['f1','f2','f3','f4','f5'])
(['f1', 'f2', 'f3'], ['f4', 'f5'], )
四 目錄對比1 點睛
通過dircmp(a,b[,ignore[,hide]])類建立乙個目錄 比較物件,其中a和b是參加比較的目錄名。ignore代表檔名忽略的列 表,並預設為['rcs','cvs','tags'];hide代表隱藏的列表,預設為 [os.curdir,os.pardir]。dircmp類可以獲得目錄比較的詳細資訊,如只有在a目錄中包括的檔案、a與b都存在的子目錄、匹配的檔案等,同時支援遞迴。
dircmp提供了三個輸出報告的方法:
為輸出更加詳細的比較結果,dircmp類還提供了以下屬性:
2 實戰
2.1 說明
對比dir1與dir2的目錄差異。通過呼叫dircmp()方法實現目錄差異對比功能,同時輸出目錄對比物件所有屬性資訊
2.2 **
import filecmp
a="dir1"
b="dir2"
dirobj=filecmp.dircmp(a,b,['test.py'])
print "-------------------report---------------------"
dirobj.report()
print "-------------report_partial_closure-----------"
dirobj.report_partial_closure()
print "-------------report_full_closure--------------"
dirobj.report_full_closure()
print "left_list:"+ str(dirobj.left_list)
print "right_list:"+ str(dirobj.right_list)
print "common:"+ str(dirobj.common)
print "left_only:"+ str(dirobj.left_only)
print "right_only:"+ str(dirobj.right_only)
print "common_dirs:"+ str(dirobj.common_dirs)
print "common_files:"+ str(dirobj.common_files)
print "common_funny:"+ str(dirobj.common_funny)
print "same_file:"+ str(dirobj.same_files)
print "diff_files:"+ str(dirobj.diff_files)
print "funny_files:"+ str(dirobj.funny_files)
2.3 檔案結構以比較結果
2.4 結果
e:\python\python_auto_maintain\venv\scripts\python.exe e:/python/python_auto_maintain/2_2_1.py
-------------------report---------------------
diff dir1 dir2
only in dir2 : ['aa']
identical files : ['f1', 'f2', 'f3']
differing files : ['f4', 'f5']
common subdirectories : ['a', 'code']
-------------report_partial_closure-----------
diff dir1 dir2
only in dir2 : ['aa']
identical files : ['f1', 'f2', 'f3']
differing files : ['f4', 'f5']
common subdirectories : ['a', 'code']
diff dir1\a dir2\a
identical files : ['a1']
common subdirectories : ['b', 'c', 'd']
diff dir1\code dir2\code
identical files : ['f1', 'f2', 'f3']
common subdirectories : ['ff']
-------------report_full_closure--------------
diff dir1 dir2
only in dir2 : ['aa']
identical files : ['f1', 'f2', 'f3']
differing files : ['f4', 'f5']
common subdirectories : ['a', 'code']
diff dir1\a dir2\a
identical files : ['a1']
common subdirectories : ['b', 'c', 'd']
diff dir1\a\c dir2\a\c
identical files : ['c1', 'c2']
diff dir1\a\b dir2\a\b
identical files : ['b1', 'b2', 'b3']
diff dir1\a\d dir2\a\d
identical files : ['c1', 'c2']
diff dir1\code dir2\code
identical files : ['f1', 'f2', 'f3']
common subdirectories : ['ff']
diff dir1\code\ff dir2\code\ff
identical files : ['f3']
left_list:['a', 'code', 'f1', 'f2', 'f3', 'f4', 'f5']
right_list:['a', 'aa', 'code', 'f1', 'f2', 'f3', 'f4', 'f5']
common:['a', 'f1', 'f2', 'code', 'f4', 'f5', 'f3']
left_only:
right_only:['aa']
common_dirs:['a', 'code']
common_files:['f1', 'f2', 'f4', 'f5', 'f3']
common_funny:
same_file:['f1', 'f2', 'f3']
diff_files:['f4', 'f5']
funny_files:
process finished with exit code 0
Python之 校驗源目錄與備份目錄差異
有時候我們無法確認備份目錄與源目錄的檔案是否保持一致,包括源目錄中的新檔案或目錄,更新檔案或目錄有無成功同步,定期進行校驗,沒有成功則希望有針對性的進行補備份。本例項使用了filecmp模組的left only,diff files方法地櫃獲取源目錄的更新項,再通過shutil.copyfile o...
python實現刪除檔案與目錄的方法
參考 os.remove path 刪除檔案 path.如果path是乙個目錄,丟擲 oserror錯誤。如果要刪除目錄,請使用rmdir remove 同 unlink 的功能是一樣的 在windows系統中,刪除乙個正在使用的檔案,將丟擲異常。在unix中,目錄表中的記錄被刪除,但檔案的儲存還在...
python3校驗源與備份目錄差異
有時候我們無法確認備份目錄與源目錄檔案是否保持一致,包括源目錄中的新檔案或目錄 更新檔案或目錄有無成功同步,定期進行校驗,沒有成功則希望有針對性地進行補備份。本示例使用了filecmp模組的left only diff files方法遞迴獲取源目錄的更新項,再通過shutil.copyfile os...