filecmp ----比较文件&目录

filecmp------比较文件

作用:比较文件系统中的文件和目录

filecmp模块包含一些函数喝一个类来比较文件系统中的文件和目录。

  1.1 cmp()用于比较文件系统中的两个文件

1 import filecmp
2 
3 print filecmp.cmp("\...\...\testfile1","\...\...\testfile2",shallow=False)

备注:①"\...\...\testfile1","\...\...\testfile2"为比较的两个文件,“shallow=False”参数告诉cmp()除了文件的源数据外,是否还要查看文件的内容。默认情况下,会使用有os.stat()得到的信息完成一个浅比较,而不查看内容。对于同时创建的相同大小的文件如果不比较内容会报告相同

  1.2 cmpfiles()多文件比较

  如果非递归地比较两个目录中的一组文件,可以使用cmpfiles()。参数是目录名和两个位置上要检查的文件列表。传入的公共文件列表应当只包含文件名,而且这些文件在两个位置上都应当出现。

 1 import filecmp
 2 import os
 3 
 4 d1 = sets(os.listdir("dir1"))
 5 d2 = sets(os.listdir("dir2"))
 6 
 7 common = list(d1 & d2)
 8 common_files = [f
 9                 for f in common
10                 if os.path.isfile(os.path.join("dir1",f))
11                ]    
12 print "common files:",common_files
13 
14 match,mismatch,errors = filecmp.cmpfiles("dir1","dir2",common_files)
15 
16 print "Match : " , match
17 print "Mismatch : " , mismatch
18 print "Error : " , errors

cmpfiles() 返回3个文件名列表,分别包含匹配的文件、不匹配的文件和不能比较的文件(权限问题或出于其他原因)

2.1 比较目录

  对于大目录树的递归比较或者完成更完整的分析,dircmp类会更有用。

1 import filecmp
2 filecmp.dircmp("dir1","dir2").report()

  report()会打印比较两个目录的报告

  需要递归子目录对比可以使用report_full_closure()

2.2 程序中的使用

  

 1 import filecmp
 2 import pprint
 3  
 4 dc = filecmp.dircmp("dir1","dir2")
 5 print "Left : "
 6 pprint.pprint(dc.left_list)
 7  
 8 print "\nRight : "
 9 pprint.pprint(dc.right_list)
10  
11 """可以传入参数,对输入进行过滤。"""
12 dc = filecmp.dircmp("dir1","dir2",ignore=["common_file"])
13 print "Left : "
14 pprint.pprint(dc.left_list)
15  
16 print "\nRight : "
17 pprint.pprint(dc.right_list)

  dc.common:两个输入目录中共有的文件名保存在common

  dc.left_only:左目录独有文件(dircmp()的第一个参数 left)

  dc.right_only:右目录独有文件(dircmp()的第二个参数 right)

  公共成员可以进一步分解为文件、目录和funny(两个目录中类型不同的内容或者os.stat()指出错误的地方)。dc.common_dirs、dc.common_files、dc.common_funny。文件之间的差别:dc.same_files、dc.deff_files、dc.funny_files。子目录也会保存(dc.subdirs) 属性subdirs是一个字典,它将目录名映射到新的dircmp对象,从而能容易地完成递归比较。

参照:《python标准库》

posted @ 2013-05-19 20:45  烤串的_  阅读(887)  评论(0编辑  收藏  举报