Python对比两个文件夹的文件差异并导出差异

python脚本:

# -*-coding:utf-8-*-    
  
#===============================================================================  
# 目录对比工具(包含子目录 ),并列出
# 1、A比B多了哪些文件  
# 2、B比A多了哪些文件  
# 3、二者相同的文件: md5比较
#===============================================================================  
  
import os
import time
import difflib
import hashlib
import shutil


def getFileMd5(filename):
    if not os.path.isfile(filename):
        print('file not exist: ' + filename)
        return
    myhash = hashlib.md5()
    f = open(filename,'rb')
    while True:
        b = f.read(8096)
        if not b :
            break
        myhash.update(b)
    f.close()
    return myhash.hexdigest()


def getAllFiles(path):
    flist=[]
    for root, dirs , fs in os.walk(path):
        for f in fs:
            f_fullpath = os.path.join(root, f)
            f_relativepath = f_fullpath[len(path):]
            flist.append(f_relativepath)
    return flist

def dirCompare(comparePath,targetPath):
    afiles = getAllFiles(comparePath)
    bfiles = getAllFiles(targetPath)

    setA = set(afiles)
    setB = set(bfiles)

    commonfiles = setA & setB  # 处理共有文件

    for of in sorted(commonfiles):
        amd=getFileMd5(comparePath+'\\'+of)
        bmd=getFileMd5(comparePath+'\\'+of)
        if amd != bmd:  
            if not os.path.exists(os.path.dirname(os.getcwd() + of)):
                os.makedirs(os.path.dirname(os.getcwd() + of))
            # 将文件保存在执行此脚本的目录...
            shutil.copyfile(targetPath + of, os.getcwd() + of)

    # 处理仅出现在一个目录中的文件
    onlyFiles = setA ^ setB
    onlyInA = []
    onlyInB = []
    for of in onlyFiles:
        if of in afiles:
            onlyInA.append(of)
        elif of in bfiles:
            onlyInB.append(of)
            
    if len(onlyInA) > 0:
        print ('-' * 20,"only in ", comparePath, '-' * 20)
        for of in sorted(onlyInA):
            print (of)
            # 不保存comparePath多出来的文件...
            
    if len(onlyInB) > 0:
        print ('-' * 20,"only in ", targetPath, '-' * 20)
        for of in sorted(onlyInB):
            print (of)
            if not os.path.exists(os.path.dirname(os.getcwd() + of)):
                os.makedirs(os.path.dirname(os.getcwd() + of))
            # 将文件保存在执行此脚本的目录...
            shutil.copyfile(targetPath + of, os.getcwd() + of)
            
if __name__ == '__main__':
    comparePath = 'D:\\test1\\assets' #对比文件夹
    targetPath = 'D:\\test2\\assets' #参考文件夹
    savePath = 'D:\\test3\\assets' #保存文件夹,在这里我没保存到savePath,大家如果需要保存,可以把脚本中的os.getcwd()替换为savePath
    dirCompare(comparePath, targetPath)
    print("\ndone!")

参考文章:https://blog.csdn.net/linxinfa/article/details/90240952

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值