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目录下生成一个文件树。
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()得到的信息来完成一个浅比较。如果结果是一样的,则认为文件相同。因此,对于同时创建的相同大小的文件,即使他们的内容不同,也会报告为是相同的文件。当浅为假时,则要比较文件的内容。
如果非递归的比较两个目录中的一组文件,则可以使用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个文件名列表,分别包含匹配的文件,不匹配的文件和不能比较的文件(由于权限问题或出于其他原因)。