Python實現檔案與目錄差異對比

2021-09-11 01:16:34 字數 4579 閱讀 3873

一 點睛

當我們進行**審計或校驗備份結果時,往往需要檢查原始與目標目錄的檔案一致性,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...