用python如何对比两个目录、文件差异,同名文件MD5是否一致

工作中经常遇到版本迭代,需要对比两个工作目录文件是否有被改动,这时需要对比上个版本跟当前版本的文件、目录差异。在网上搜出来的工具,要么只能对比两个文件的内容差异,要么只能对比两个目录的差异。无法实现根目录下各层级子目录、同名文件MD5的差异。于是就自己写了个脚本,对比两个指定目录下,文件名是否一致、目录是否一致,子目录下的各层级文件、目录是否一致,两个同层级同名文件的MD5是否一致,然后将文件、目录差异打印到屏幕。这样就可以一目了然看到两个目录的差异了。

"""
describe: 该脚本用于比较两个目录下文件、目录的差异,相同层级的文件会对比MD5是否一致;
author:weib
date:20221029
"""
​
import hashlib
import os
from natsort import natsort
​
def get_file_md5(file_name):
    """
    计算文件的md5
    :param file_name:
    :return:
    """
    m = hashlib.md5()  # 创建md5对象
    with open(file_name, 'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  # 更新md5对象
    # print(m.hexdigest()) # 打印MD5
    return m.hexdigest()  # 返回md5对象
    
def diff_list(list1, list2, dir1, dir2):
    all_list = set(list1 + list2)
    if len(all_list)>0:
        for i in all_list:
            if i in list1 and i not in list2:
                print(f"{dir1}目录中多出:{i}")
            if i in list2 and i not in list1:
                print(f"{dir2}目录中多出:{i}")
            if i in list1 and i in list2:
                if os.path.isdir((dir1 + "\\" + i)) and os.path.isdir((dir2 + "\\" + i)) :
                    dir11 = dir1 + "\\" + i
                    dir22 = dir2 + "\\" + i
                    do(dir11,dir22)
                if os.path.isfile((dir1 + "\\" + i)) and os.path.isfile((dir2 + "\\" + i)):
                    file11 = dir1 + "\\" + i
                    file22 = dir2 + "\\" + i
                    # print("开始比较两个文件的MD5")
                    if get_file_md5(file11) == get_file_md5(file22):
                        pass
                        # print("两个文件的MD5一致")
                    else:
                        print(f"****请检查 {file11} 文件和 {file22} 文件,两个文件的MD5不一致****")
​
def do(dir1, dir2):
    flist1 = os.listdir(dir1)
    flist2 = os.listdir(dir2)
    # 文件目录重新自然排序,同Windows
    new_filelist1 = natsort.natsorted(flist1)
    new_filelist2 = natsort.natsorted(flist2)
    diff_list(new_filelist1, new_filelist2, dir1, dir2)
​
# 使用时请修改如下两个对比的目录。


dir1 = "E:\\D01\\"
dir2 = "E:\\D02\\"
​
if __name__ == '__main__':
    # 仅打印输出有差异的文件、目录,若执行完成无内容输出,则表示两个目录无差异。
    do(dir1,dir2)

目录缺失、文件名不一致:
在这里插入图片描述

同层级、同名文件内容不一致:
在这里插入图片描述

运行结果:
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值