模組常用方法說明
阿新 • • 發佈:2018-12-30
一、概要
filecmp提供了三個操作方法,分別為cmp(單檔案對比)、cmpfiles(多檔案對比)、dircmp(目錄對比)。
二、單檔案對比
- 單檔案對比:採用filecmp.cmp(f1,f2[,shallow])方法,比較檔名為f1和f2的檔案,相同返回True,不相同返回False,shallow預設為True,意思是隻根據os.start()方法返回的檔案基本資訊進行對比,比如最後訪問時間、修改時間、狀態改變時間等,會忽略檔案內容的對比。當shallow為False時,則os.stat()與檔案內容同時進行校驗。
示例:比較單檔案的差異
[[email protected]file_cmp]# ls f1 f1.bak f2 f3 [[email protected] file_cmp]# cat f1 f1 [[email protected] file_cmp]# cat f1.bak f1 [[email protected] file_cmp]# cat f2 f2 [[email protected] file_cmp]# cat f3 f3 >>> import filecmp >>> filecmp.cmp("/usr/local/test/file_cmp/f1","/usr/local/test/file_cmp/f3") False >>> filecmp.cmp("/usr/local/test/file_cmp/f1","/usr/local/test/file_cmp/f2") False >>> filecmp.cmp("/usr/local/test/file_cmp/f1","/usr/local/test/file_cmp/f1.bak") True
三、多檔案對比
- 多檔案對比:採用filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,對比dir1與dir2目錄給定的檔案清單。該方法返回檔名的三個列表,分別為匹配、不匹配、錯誤。匹配為包含匹配的檔案的列表,不匹配反之,錯誤列表包含了目錄不存在檔案、不具備讀許可權或其他原因導致的不能比較的檔案清單。
示例:dir1與dir2目錄中指定檔案清單對比。
兩個目錄下檔案的md5資訊如下,其中f1、f2檔案匹配;f3不匹配;f4、f5對應目錄中不存在,無法比較。
[[email protected] dir1]# ls f1 f2 f3 f5 [[email protected] dir2]# ls f1 f2 f3 f4 [[email protected] dir1]# md5sum * 76f845935e5462187e9e2fe9d1d76335 f1 ead10818fcf36e07baf71d2f4e7f7a9a f2 a120ab265b4ead14f2a10d14341f1695 f3 a5854eff3e658689037e8e6b275cfff1 f5 [[email protected] dir2]# md5sum * 76f845935e5462187e9e2fe9d1d76335 f1 ead10818fcf36e07baf71d2f4e7f7a9a f2 44c05888b6f01f0d97eb884edd8a5e89 f3 a00f03999b301301ee1a90a89c21a704 f4
使用cmpfiles對比的結果如下:
>>> import filecmp >>> filecmp.cmpfiles("/usr/local/test/file_cmp/dir1","/usr/local/test/file_cmp/dir2",['f1','f2','f3','f4','f5']) (['f1', 'f2'], ['f3'], ['f4', 'f5'])
四、目錄對比
通過dircmp(a,b[,ignore[,hide]])類建立一個目錄比較物件,其中a和b是參加比較的目錄名。ignore代表檔名忽略的列表,並預設為['ECS','CVS','tags'];hide代表隱藏的列表,預設為[os,curdir,os.pardir]。dircmp類可以獲得目錄比較的詳細資訊,如只有在a目錄中包括的檔案、a與b都存在的子目錄、匹配的檔案等,同時支援遞迴。
dircmp提供了三個輸出報告的方法:
report(),比較當前指定目錄中的內容;
report_partial_closure(),比較當前指定目錄及第一級子目錄中的內容;
report_full_closure(),遞迴比較所有指定目錄的內容。
為輸出更加詳細的比較結果,dircmp類還提供了以下屬性:
left,左目錄,如類定義中的a;
right,右目錄,如類定義中的b;
left_list,左目錄中的檔案及目錄列表;
right_list,右目錄中的檔案及目錄列表;
common,兩邊目錄共同存在的檔案或目錄;
left_only,只在左目錄中的檔案或目錄;
right_only,只在右目錄中的檔案或目錄;
common_dirs,兩邊目錄都存在的子目錄;
common_files,兩邊目錄都存在的子檔案;
common_funny,兩邊目錄都存在的子目錄(不同目錄型別或os.stat()記錄的錯誤);
same_files,匹配相同的檔案;
diff_files,不匹配的檔案;
funny_files,兩邊目錄中都存在,但無法比較的檔案;
subduers,將common_dirs目錄對映到新的dircmp物件,格式為字典型別。
示例:對比dir1與dir2的目錄差異。
通過呼叫dircmp()方法實現目錄差異對比功能,同時輸出目錄對比物件所有屬性資訊。
通過tree命令輸出的兩個目錄
執行前面的程式碼輸出,結果如下:
[[email protected] file_cmp]# python3 simple.py diff /usr/local/test/file_cmp/dir1 /usr/local/test/file_cmp/dir2 Only in /usr/local/test/file_cmp/dir1 : ['f5'] Only in /usr/local/test/file_cmp/dir2 : ['aa', 'f4'] Identical files : ['f1', 'f2'] Differing files : ['f3'] Common subdirectories : ['a'] diff /usr/local/test/file_cmp/dir1 /usr/local/test/file_cmp/dir2 Only in /usr/local/test/file_cmp/dir1 : ['f5'] Only in /usr/local/test/file_cmp/dir2 : ['aa', 'f4'] Identical files : ['f1', 'f2'] Differing files : ['f3'] Common subdirectories : ['a'] diff /usr/local/test/file_cmp/dir1/a /usr/local/test/file_cmp/dir2/a Common subdirectories : ['a1', 'b'] diff /usr/local/test/file_cmp/dir1 /usr/local/test/file_cmp/dir2 Only in /usr/local/test/file_cmp/dir1 : ['f5'] Only in /usr/local/test/file_cmp/dir2 : ['aa', 'f4'] Identical files : ['f1', 'f2'] Differing files : ['f3'] Common subdirectories : ['a'] diff /usr/local/test/file_cmp/dir1/a /usr/local/test/file_cmp/dir2/a Common subdirectories : ['a1', 'b'] diff /usr/local/test/file_cmp/dir1/a/a1 /usr/local/test/file_cmp/dir2/a/a1 diff /usr/local/test/file_cmp/dir1/a/b /usr/local/test/file_cmp/dir2/a/b Identical files : ['b1', 'b2', 'b3'] left_list:['a', 'f1', 'f2', 'f3', 'f5'] right_list:['a', 'aa', 'f1', 'f2', 'f3', 'f4'] common:['a', 'f1', 'f2', 'f3'] left_only:['f5'] right_only:['a', 'aa', 'f1', 'f2', 'f3', 'f4'] common_dirs:['a'] common_files:['f1', 'f2', 'f3'] common_funny:[] same_file:['f1', 'f2'] diff_files:['f3'] funny_files:[]