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

2023-11-01

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • write和fwrite

    如果只是普通地以O RDWR的flag去open一个文件朝里write 不考虑创建 扩增 那默认内核会把文件的这个页面读进来缓存在内核里的 也即所谓的page cache 随后再发起新的write syscall写相同的页面时 只要写在pa
  • vue3中将表格导出成excel文件

    yarn add xlsx yarn add file saver 通过调用exportData方法 excel 文件 传递数据和文件名 function exportToExcel tableData filename 1 JSON 数据
  • 【FPGA】SPI协议

    1 SPI简介 SPI Serial Perripheral Interface 串行外围设备接口 是 Motorola 公司推出的一种同步串行接口技术 SPI 总线在物理上是通过接在外围设备微控制器 PICmicro 上面的微处理控制单元
  • 掌优电子为商家提供合理的移动支付解决方案

    目前官方正式对外的是微信的青蛙 和支付宝的蜻蜓 而市面上众多的刷脸支付设备 更多的是作为系统商联系对应的厂商进行生产 并非官方授权 其背后的安全性是值得考究的 从客观角度去讲的话 官方的设备 就算贵 但正规 安全 且用的放心 刷脸支付的问世
  • vue项目中实现文字滚动(跑马灯)效果——公告滚动播放

    项目需求 系统公告 要从右忘左循环播放的牛皮广告效果 实现 方案一 使用定时器和CSS3的过渡属性来实现
  • gitea无法连接mysql_Git push ERROR: Repository not found fatal:无法连接远程数据库

    用linux Debian git 上传到github 遇到的问题以及解决方案 git init git add bubble go git add bubble test go git commit m git remote add or
  • Python自学心得分享

    学习python 我首先根据自己完全代码零基础的情况下 为什么学习Python作为核心问题 进行了一个自我定位以及目标定位 我认为只要有一个目标 那么就找方法去打成目标就行了 我是完全零基础 选择学习Python主要还是因为看到大家都说Py
  • Struts2 validation.xml 正则表达式不起作用

  • Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 xlwings模块详解 1 快速入门 1 打开Excel 2 创建工作簿 2 1
  • MyBatis如何实现多表联查

    一 通过映射配置文件实现多表联查 首先 使用Mysql数据库 创建两个表 分别为学生表Student表和班级表Class表 在Student表中添加列classid参照主表的列id的外键约束 学生表Student表 班级表Class表 现在
  • (三)工作流Activiti7-个人任务查询及完成

    前言 在 上篇文章中我们已经完成了流程的定义和部署 通过repositoryService部署并启动流程后就已经开始给每个负责人分配任务了 比如下图 assignee可以写死但一般都是通过变量来设置任务负责人的 在启动一个流程实例的时候就可
  • linux命令之chmod

    chmod 英文全拼 change mode 命令是控制用户对文件的权限的命令 常见报错提醒 Permission denied 解决方法 chmod 777 lady sh 原理详解 首先 查看文件权限 命令 ls l 若想设置文件权限
  • idea整合git解决代码冲突(图文通俗易懂)

    idea整合git的步骤如下 1 快速搭建一个web工程 2 在idea对git进行相关配置 自行下载安装git 配置git exe的路径 自行注册github账号 添加github账号到idea 3 对项目新建一个本地仓库 新建仓库后 找
  • FTP连接时出现“227 Entering Passive Mode” 的解决方法

    今天从公网的服务器连接本地内网的FTP server copy文件时 系统老是提示227 Entering Passive Mode xxx xxx xxx xxx x 很是奇怪 于是上网找资料仔细研究了一下 原来FTP有两种工作模式 PO
  • Python从入门到放弃 (一) Python3的安装 以及pip安装

    编程语言只是一个工具 能够让这个工具具有什么样的效果取决于使用这个工具的人 笔者根据自己的经验写了一下Python3的学习 让新手小白快速入门 不足之处请读者指正 一 Python入门学习介绍 任何一门编程语言都需要开发环境 有了开发环境才
  • IP地址大全之IPV4版

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 IP 地 址 我们平时说的IP地
  • 响应式开发一招致胜 学习视频 分享

    转载于 https www cnblogs com ios9 p 8526562 html
  • VS远程调试与附加调试

    一 发送文件到目标机器 我的程序是x64 所以拷贝这个文件夹到目标机器即可 二 配置目标机器为远程调试状态 zheg 1 双击msvsmon exe 2 配置无需密码直接可以远程 工具 gt 选项 gt 选择无身份验证 允许任何用户进行调试
  • Python numpy函数:shape用法

    shape函数是numpy core fromnumeric中的函数 它的功能是读取矩阵的长度 比如shape 0 就是读取矩阵第一维度的长度 shape的输入参数可以是一个整数 表示维度 也可以是一个矩阵 以下例子可能会好理解一些 1 参
  • Python对比两个文件夹的文件差异并导出差异

    python脚本 coding utf 8 目录对比工具 包含子目录 并列出 1 A比B多了哪些文件 2 B比A多了哪些文件 3 二者相同的文件 md5比较 import os import time import difflib impo