Python实现文件与目录差异对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/87474806

一 点睛

当我们进行代码审计或校验备份结果时,往往需要检查原始与目标目录的文件一致性,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都存在的子目录、匹配的文件等,同时支持递归。

扫描二维码关注公众号,回复: 5298825 查看本文章

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,两边目录中都存在,但无法比较的文件; 
  • subdirs,将common_dirs目录名映射到新的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

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/87474806