Loading

模块常用方法说明

一、概要

  官方文档:https://docs.python.org/2/library/filecmp.html

  filecmp提供了三个操作方法,分别为cmp(单文件对比)、cmpfiles(多文件对比)、dircmp(目录对比)。

二、单文件对比

  • 单文件对比:采用filecmp.cmp(f1,f2[,shallow])方法,比较文件名为f1和f2的文件,相同返回True,不相同返回False,shallow默认为True,意思是只根据os.start()方法返回的文件基本信息进行对比,比如最后访问时间、修改时间、状态改变时间等,会忽略文件内容的对比。当shallow为False时,则os.stat()与文件内容同时进行校验。

示例:比较单文件的差异

[root@localhost file_cmp]# ls
f1  f1.bak  f2  f3
[root@localhost file_cmp]# cat f1
f1
[root@localhost file_cmp]# cat f1.bak
f1
[root@localhost file_cmp]# cat f2
f2
[root@localhost 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对应目录中不存在,无法比较。

[root@localhost dir1]# ls
f1  f2  f3  f5
[root@localhost dir2]# ls
f1  f2  f3  f4

[root@localhost dir1]# md5sum *
76f845935e5462187e9e2fe9d1d76335  f1
ead10818fcf36e07baf71d2f4e7f7a9a  f2
a120ab265b4ead14f2a10d14341f1695  f3
a5854eff3e658689037e8e6b275cfff1  f5

[root@localhost 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命令输出的两个目录

运行前面的代码输出,结果如下:

[root@localhost 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:[]

 

posted @ 2018-05-25 20:26  KubeSec  阅读(371)  评论(0编辑  收藏  举报