Python3 filecmp模块测试比较文件原理解析

  

1. filecmp比较文件

  

filecmp模块提供了一些函数和一个类来比较文件系统上的文件和目录。

  

1.1示例数据

  

使用下面代码创建一组测试文件。

        进口操作系统   def mkfile(文件名、身体=None):   张开f(文件名,“w”):   f。写(身体或文件名)   返回      def make_example_dir(上):   如果不是os.path.exists(上):   os.mkdir(上)   curdir=os.getcwd ()   os.chdir(上)   os.mkdir (“dir1”)   os.mkdir (“dir2”)   mkfile (“dir1/file_only_in_dir1”)   mkfile (“dir2/file_only_in_dir2”)   os.mkdir (“dir1/dir_only_in_dir1”)   os.mkdir (“dir2/dir_only_in_dir2”)   os.mkdir (“dir1/common_dir”)   os.mkdir (“dir2/common_dir”)   mkfile (‘dir1/common_file’,这个文件是相同的)   操作系统。链接(“dir1/common_file”、“dir2/common_file”)   mkfile (“dir1/contents_differ”)   mkfile (“dir2/contents_differ”)   #更新的访问和修改时间,所以大部分的统计   #将匹配结果。   圣=os.stat (“dir1/contents_differ”)   操作系统。utime (‘dir2/contents_differ’, (st.st_atime st.st_mtime))   mkfile (' dir1/file_in_dir1 ', '这是一个文件在dir1 ')   os.mkdir (“dir2/file_in_dir1”)   os.chdir (curdir)   返回      if __name__==癬_main__”:   os.chdir (os.path.dirname (__file__)或os.getcwd ())   make_example_dir(示例)   make_example_dir(例/dir1/common_dir)   make_example_dir(例/dir2/common_dir)      

运行这个脚本会在axample目录下生成一个文件树。

  

 Python3 filecmp模块测试比较文件原理解析

  

common_dir目录下也有同样的目录结构,以提供有意思的递归比较选择。

  

1.2比较文件

  

cmp()用于比较文件系统上的两个文件。

        进口filecmp   打印(“common_file:”,结束=')   打印(filecmp.cmp(例/dir1/common_file,   “例子/dir2/common_file”,   浅=True),   结束=')   打印(filecmp.cmp(例/dir1/common_file,   “例子/dir2/common_file”,   浅=False))   打印(“contents_differ:”,结束=')   打印(filecmp.cmp(例/dir1/contents_differ,   “例子/dir2/contents_differ”,   浅=True),   结束=')   打印(filecmp.cmp(例/dir1/contents_differ,   “例子/dir2/contents_differ”,   浅=False))   打印(相同的:,结束=')   打印(filecmp.cmp(例/dir1/file_only_in_dir1,   “例子/dir1/file_only_in_dir1”,   浅=True),   结束=')   打印(filecmp.cmp(例/dir1/file_only_in_dir1,   “例子/dir1/file_only_in_dir1”,   浅=False)      

shallo参数告诉cmp()除了文件的元数据外,是否还要查看文件的内容。默认情况下,会使用由os.stat()得到的信息来完成一个浅比较。如果结果是一样的,则认为文件相同。因此,对于同时创建的相同大小的文件,即使他们的内容不同,也会报告为是相同的文件。当浅为假时,则要比较文件的内容。

  

 Python3 filecmp模块测试比较文件原理解析

  

如果非递归的比较两个目录中的一组文件,则可以使用cmpfiles()。参数是目录名和两个位置上要检查的我就爱你列表。传入的公共文件列表应当只包含文件名(目录会导致匹配不成功),而且这些文件在两个位置上都应当出现。下一个例子显示了构造公共列表的一种简单方法。与cmp()一样,这个比较也有一个浅的标志。

        进口filecmp   进口操作系统   #确定项目中存在的两个目录中   d1_contents=集(os.listdir(例/dir1))   d2_contents=集(os.listdir(例/dir2))   常见=列表(d1_contents,d2_contents)   common_files=[   f   f的共同点   如果os.path.isfile (os.path。加入(例/dir1, f))   ]   打印(常见的文件:,common_files)   #比较目录   匹配,不匹配,错误=filecmp.cmpfiles (   “例子/dir1”,   例子/dir2,   common_files,   )   打印(:匹配,匹配)   打印(:不匹配,不匹配)   打印(“错误:”,错误)      

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

  

 Python3 filecmp模块测试比较文件原理解析

Python3 filecmp模块测试比较文件原理解析