Python标准库(3)—filecmp
2021-05-12 本文已影响0人
北邮郭大宝
filecmp模块用来比较目录、文件是否相同。举例如下:
构建两个文件夹,其结构如图所示:

其中data内容保持一致,data1内容不一致,data2是tmp独有,readme1和readme内容一致。
如果单纯比较两个文件是否相同,可以通过filecmp.cmp(f1, f2, shallow=True)实现。其中f1、f2是文件名,shallow=True,则通过文件的元信息比较是否一致,如果是False,则比较两个文件内容。
import filecmp
from pathlib import Path
def main():
filecmp.clear_cache() # 清除 filecmp 缓存
p = Path(".")
p1 = p / 'tmp' / 'data'
p2 = p / 'tmp' / 'data1'
print(filecmp.cmp(p1, p2))
if __name__ == '__main__':
main()
如果非递归比较两个目录中的一组文件,可以选择通过filecmp.cmpfiles(dir1, dir2, common, shallow=True)实现。其中dir1、dir2是两个文件夹,common是list,里面是需要比较的共同文件名称。
import filecmp
from pathlib import Path
def main():
filecmp.clear_cache() # 清除 filecmp 缓存
p = Path(".")
p3 = p / 'tmp'
p4 = p / 'tmp1'
match, mismatch, error = filecmp.cmpfiles(p3, p4, common=['data', 'data1', 'data2'])
print(match, mismatch, error)
if __name__ == '__main__':
main()
对于大目录树的递归比较或者更完整的分析,可以选择使用dircmp类。
-
report() 打印两个目录报告,非递归
-
report_full_closure() 递归打印两个目录
-
当然也可以通过更低级的API去实现,参见dir_files_diff()
import filecmp
from filecmp import dircmp
from pathlib import Path
def dir_files_diff(dcmp: dircmp):
for name in dcmp.common_files:
print("the same file found in two dirs: %s" % name)
for name in dcmp.diff_files:
print("diff file found in two dirs: %s" % name)
for name_left in dcmp.left_only:
print("only found in left dir: %s/%s" % (dcmp.left, name_left))
for name_right in dcmp.right_only:
print("only found in right dir: %s/%s" % (dcmp.right, name_right))
for sub_dcmp in dcmp.subdirs.values():
dir_files_diff(sub_dcmp)
def main():
filecmp.clear_cache() # 清除 filecmp 缓存
p = Path(".")
dcmp = dircmp(p3, p4)
dcmp.report() # 只包括给定目录的内容的报告
dcmp.report_full_closure() # 递归比较后的报告
dir_files_diff(dcmp) # 自定义比较
if __name__ == '__main__':
main()
整体效果:
