1. 程式人生 > >模組常用方法說明

模組常用方法說明

一、概要

  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:[]