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标准库》