Python标准库(3)—filecmp

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()

整体效果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章