初步提示:测试代码中,右尖括号(>)表示命令行输入的命令;输出内容;库的导入仅在本文第一个测试代码中展示,其他代码块中省略了库的导入代码。系统类型:Windows10python版本:Python3.9.0filecmp模块可用于文件到文件或目录到目录的比较。并且可以通过设置参数来选择多种不同耗时和不同精度的方案。filecmp模块在比较文件或目录时只能返回相等的结果。有些场景需要更详细的结果描述,可以使用difflib标准库。快捷函数filecmp.cmp(f1,f2,shallow=True)参数:f1,f2:要比较的两个文件shallow:关键字参数,参数值为布尔值,默认为True;如果为True,则判断两个文件Files需要有相同的os.stat()签名才认为相等;如果为False,则比较两个文件的内容;返回值:Boolean,两个文件是否相等比较f1和f2的文件是否相等返回True,否则返回False。官方文档中使用了“似乎”这个词,让人感觉有些隐晦的信息没有在文档中表达出来。importfilecmpimportos'''本次测试代码中有4个文件需要比较,其中文件1和文件2内容不同,文件3和文件4内容相同'''print(os.stat('file1'))print(os.stat('file2'))print(filecmp.cmp('file1','file2',shallow=True))print(filecmp.cmp('file1','file2',shallow=False))#os.stat_result(st_mode=33206,st_ino=1407374883609775,st_dev=3098197482,st_nlink=1,st_uid=0,st_gid=0,st_size=4,st_atime=1611109066,st_mtime=1616,ctime=161110901611043715)#os.stat_result(st_mode=33206,st_ino=1688849860320432,st_dev=3098197482,st_nlink=1,st_uid=0,st_gid=0,st_size=4,st_atime=1611045689,st_mtime=1611045689,st_ctime=1611043722)#True#True当比较文件1和文件2内容相同时,无论设置为True还是False,参数shallow都会为True。根据文档,文件1和文件2的os.stat()不同,当参数shallow设置为True时,两个文件的os.stat()最终应该为False。为什么实际操作与文档描述不同?查阅了一些资料,找到了一个合理的解释。当参数shallow设置为True时,相同的os.stat()将被直接视为相等。当两个文件的os.stat()不同时,仍然会比较文件中的内容。另外,该函数会缓存比较结果,并在下次比较时直接返回缓存的结果。如果文件的os.stat()发生变化,即文件被修改,缓存会自动失效。也可以使用下面的filecmp.clear_cache()函数清除缓存。filecmp.cmpfiles(dir1,dir2,common,shallow=True)参数:dir1,dir2:目录common:要比较的文件名列表shallow:关键字参数,参数值为布尔值,默认为True;如果为True,则判断两个文件需要具有相同的os.stat()签名才被认为是相等的;如果为False,比较两个文件的内容;返回值:元组,包含三个列表类型的元素。比较两个目录下的指定文件,返回比较结果,返回值为包含三个list类型元素的元组。'''文件目录如下,其中,两个目录下文件a内容相同,文件c内容不同-目录1-文件a-目录b-文件c-文件d-directory2-filea-directoryb-filec''''''比较两个目录下的文件'''print(filecmp.cmpfiles('directory1','directory2',['filea','directoryb/filec','filed']))#(['filea'],['directoryb/filec'],['filed'])参数common列出了要比较的文件名,分别比较两个目录下的同名文件,如果两个文件相同,则将它们添加到返回值的第一个元素;如果两个文件的内容不同,则将它们添加到返回值的第二个元素;如果文件没有读取权限或文件在任何目录中丢失,则将返回值添加到第三个元素内;参数shallow与上面的filecmp.cmp()函数具有相同的含义。filecmp.clear_cache()清除filecmp缓存。一般情况下,文件修改后,文件的os.stat()自然会发生变化,缓存也会自动失效。但是,如果文件修改过快,超过了底层文件系统记录修改时间的精度,那么后续的文件比对就可能出现问题。这个函数就是为了解决这个问题。但是不知道怎么测试这种文件修改太快?有人知道吗?dircmpclassclassfilecmp.dircmp(a,b,ignore=None,hide=None)参数:a,b:directoryignore:关键关键字参数,要忽略的文件名列表,默认为filecmp.DEFAULT_IGNOREShide:关键字参数,列表要隐藏的文件名,默认为[os.curdir,os.pardir]创建目录比较以比较两个目录对象。参数ignore可以忽略指定的文件名,hide可以隐藏指定的文件名。print(filecmp.DEFAULT_IGNORES)#['RCS','CVS','tags','.git','.hg','.bzr','_darcs','__pycache__']print(os.curdir)#.print(os.pardir)#..dircmp类中有很多属性,这里使用测试代码直接显示:dircmp_test=filecmp.dircmp('directory1','directory2')'''thefirst(相对左边)参数也是第一个目录的名字'''print(dircmp_test.left)#directory1'''第二个(相对右边)参数也是第二个目录的名字'''print(dircmp_test.right)#目录2'''通过参数hide和参数ignore过滤后,第一个目录下的所有文件和子目录'''print(dircmp_test.left_list)#['filea','filed','directoryb']'''经过参数hide和参数ignore过滤后,第二个目录下的所有文件和子目录'''print(dircmp_test.right_list)#['filea','目录b']'''同时存在tw下的文件和子目录o目录'''print(dircmp_test.common)#['filea','directoryb']'''只显示第一个目录下的文件和子目录'''print(dircmp_test.left_only)#['filed']'''第二个目录下只有文件和子目录'''print(dircmp_test.right_only)#[]'''两个目录下同时有子目录'''print(dircmp_test.common_dirs)#['directoryb']'''将common_dirs属性值映射到dircmp对象的字典'''print(dircmp_test.subdirs)#{'directoryb':
