美文网首页
Python标准库(3)—filecmp

Python标准库(3)—filecmp

作者: 北邮郭大宝 | 来源:发表于2021-05-12 17:32 被阅读0次

    filecmp模块用来比较目录、文件是否相同。举例如下:

    构建两个文件夹,其结构如图所示:

    1620807955400.jpg

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

    整体效果:


    1620811764838.jpg

    相关文章

      网友评论

          本文标题:Python标准库(3)—filecmp

          本文链接:https://www.haomeiwen.com/subject/ymnadltx.html