前言
文件的比较有几种,例如比较文件内容、比较文件大小、直接比较整个项目文件等。 特别是在项目更新迭代中,可以使用该库比较当前版本和以前版本的文件有什么不同。因此,本篇将详细介绍Python的文件比较库: filecmp。
在比较
生成示例文件
文件之前,首先需要用于比较的文件。 所以,为了以后的测试,首先做几个文件。 示例如下所示。def mkfile (文件名,内容) :
withopen (文件名,' w ' ) as f:
f.write (内容文件名)。
返回
mfile ()文件CMPS/one.txt ),) 1212121212 ) ) )。
mfile ()文件CMPS/two.txt,) 1212121212 ) ) ) )。
mfile (文件CMPS/three.txt ),333333333 ) )在这里,我们先创建三个文件。 其中两个文件的内容相同。
cmp()(比较文件)
fliecmp库提供了cmp ()函数,用于比较文件系统上的两个文件。 示例如下所示。导入文件CMP
打印(文件CMP.CMP (文件CMPS /一个. txt )、文件CMPS/two.txt )、显示=假)
打印(文件CMP.CMP (文件CMPS /一个. txt )、文件CMPS /树. txt )、显示=假)
打印(文件中央处理器('文件中央处理器/一个. txt ','文件中央处理器/two.txt ' ) )
print (文件CMP.CMP ) )文件CMPS/one.txt,)文件CMPS /一次. txt ) ) ) ) ) )之后,效果如下。
如果参数shallow为True,则只判断os.stat ()函数返回的内容是否相同,如果相同则返回True,否则比较文件的内容是否相同,如果相同则返回True。 使用shallow参数可以快速比较文件是否发生了更改。 (shallow参数默认为True )
cmpfiles()(比较一组文件)
cmp ) )函数用于比较一个文件,但要比较两个目录中的一组文件,必须使用cmpfiles ) )函数。导入文件CMP
运行打印(文件CMP.CMP文件(文件CMPS、“文本”、公用=[ ' 13.png ',' 14.png ',' one.txt'] )后,效果如下
这里返回了三个列表。 分别是相同的列表、不同的列表和错误列表。 请注意,虽然同一列表是两个目录中的同一文件,不同列表是两个目录中的不同文件,但common指定了要比较的文件。 也就是说,这三个列表中的每个文件必须在common规范中用于比较,否则在列表中不存在比较。 错误列表意味着目录中完全没有文件。
dircmp()(比较目录)
之前的两个函数都是对文件的比较,但是项目文件的反复比较经常直接比较整个目录结构,所以也需要掌握目录的比较。 fliecmp库提供的目录比较函数是dircmp (。 示例如下所示。导入文件CMP
DC=文件中央处理器(“文件中央处理器”,“文本”) )。
执行dc.report ()后,效果如下。
age/f5d72693d9734be8b13185a24f188fa7?from=pc">第1行为对比的两个文件夹,第2第3行为对比的两个目录中的所有文件。第4行是对比后的结果,这里只有3个文件完全相同。但是需要注意的是,report()函数只是用于比较当前目录下的文件,不包括里面文件夹以及文件夹下面的文件。如果需要递归比较所有目录文件,需要用到report_full_closure()。
示例如下:
import filecmp dc = filecmp.dircmp('filecmps', 'text') dc.report_full_closure()运行之后,效果如下:
left_list与right_list
在对比文件之前,我们可以列出所比较目录中的文件以及子目录。示例如下:
import filecmp dc = filecmp.dircmp('filecmps', 'text') print(dc.left_list) print(dc.right_list)运行之后,效果如下:
left_list为第1个参数的目录,right_list为第2个参数的目录,把2个参数看成左右,自然很好区分。
忽略部分文件进行对比
在对比两个目录的所有文件之时,我们还可以手动地过滤掉不需要对比的文件及文件夹,比如我们不对比文件中的123文件夹中的所有文件,可以直接这样操作:
import filecmp dc = filecmp.dircmp('filecmps', 'text',ignore=['123']) dc.report_full_closure()运行之后,效果如下:
report_full_closure()函数本来需要一层一层目录去对比的。这里,博主过滤掉了其唯一的子目录123,所以只存在一层文件的对比。目录结构如下:
其他属性
除了这些方法与属性之外,还有其他的属性供开发者调用,比如只查找相同的文件,或者只判断某个目录的独有文件,可以这样操作:
import filecmp dc = filecmp.dircmp('filecmps', 'text') print(dc.common) print(dc.right_only) print(dc.left_only)运行之后,效果如下:
common:为2目录同时存在的文件名
right_only:为右目录独有的文件
left_only:为左目录独有的文件。
这里的common公共目录还可以进一步的操作,示例如下:
import filecmp dc = filecmp.dircmp('filecmps', 'text') print(dc.common_dirs) print(dc.common_files) print(dc.common_funny)运行之后,效果如下:
common_dirs:公共的文件夹
common_files:公共的文件
common_funny: 2个目录中类型不同的内容,或os.stat()指出的有错误的地方(可以简单的理解有一个文件夹是123,一个文件也是123,那么就会出现在common_files中)
以上是相同的划分,我们还有不同的划分,示例如下:
import filecmp dc = filecmp.dircmp('filecmps', 'text') print(dc.same_files) print(dc.diff_files) print(dc.funny_files)这里一一对应上面的公共,只是是不同的不是公共的。运行之后,效果如下:
最后还有一个属性:subdirs,用于将目录名映射到新的dircmp对象。示例如下:
import filecmp dc = filecmp.dircmp('filecmps', 'text') print(dc.subdirs)运行之后,效果如下: