原文链接:http://www.juzicode.com/python-module-filecmp
filecmp模块可以用来比较文件或者目录。
安装和导入
filecmp是Python自带的模块,不需要额外安装,直接导入即可:
import filecmp as fc
#或者
import filecmp
cmp()比较2个文件
直接调用cmp()函数就可以完成2个文件的比对。该函数接受3个入参,第1,2个入参是需要对比的2个文件路径,第3个入参shallow。如果shallow为True并且两个文件的os.stat()中的签名信息(文件类型、大小和修改时间)一致,则结果返回True。其他情况下如果文件大小或者文件内容不一样则结果返回False。
我们首先准备3个文件,分别为file-a.txt和它的拷贝file-a-copy.txt,以及file-b.txt,file-b.txt的内容和file-a.txt有差异。
#juzicode.com/VX公众号:juzicode
import filecmp as fc
fn1 = 'file-a.txt'
fn2 = 'file-a-copy.txt' # 文件内容和file-a.txt一模一样
fn3 = 'file-b.txt' # 文件内容和file-a.txt有差异
ret = fc.cmp(fn1,fn2)
print('文件%s 和文件%s 是否一样:'%(fn1,fn2), ret)
ret = fc.cmp(fn1,fn3)
print('文件%s 和文件%s 是否一样:'%(fn1,fn3), ret)
运行结果:
文件file-a.txt 和文件file-a-copy.txt 是否一样: True
文件file-a.txt 和文件file-b.txt 是否一样: False
cmpfiles()比较2个目录
cmpfiles(dir1, dir2, common, shallow=True)其中dir1和dir2确定要比较的2个目录中。
common指定名称的文件,可以是列表或者元组。
返回值为3个列表:match, mismatch, errors。其中match为匹配的文件; mismatch为不匹配的文件;errors 列出那些因为各种原因没有被比较的文件,比如文件不存在于两目录中的任一个、缺少读取它们的权限等等。
参数shallow含义和filecmp.cmp()一致。
例如,cmpfiles(‘dir-a’, ‘dir-b’, [‘c.txt’, ‘d/e.txt’,’f.txt’]) 将会比较dir-a/c.txt与dir-b/c.txt以及dir-a/d/e.txt与dir-b/d/e.txt、dir-a/f.txt与dir-b/f.txt 。’c.txt’、’d/e.txt’、’f.txt’ 将会出现在返回值的某一个列表中。
#juzicode.com/VX公众号:juzicode
import filecmp as fc
dir1 = 'dir-a'
dir2 = 'dir-b'
match, mismatch, errors = fc.cmpfiles(dir1,dir2,['c.txt','d\\e.txt','f.txt'])
print('一样的文件:', match)
print('不同的文件:', mismatch)
print('未能比较的文件:', errors)
运行结果:
一样的文件: ['d\\e.txt']
不同的文件: ['f.txt']
未能比较的文件: ['c.txt']