Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】


Posted in Python onJune 20, 2017

本文实例讲述了Python编程实现两个文件夹里文件的对比功能。分享给大家供大家参考,具体如下:

#-*-coding:utf-8-*-
#===============================================================================
# 目录对比工具(包含子目录 ),并列出
# 1、A比B多了哪些文件
# 2、B比A多了哪些文件
# 3、二者相同的文件:文件大小相同 VS 文件大小不同 (Size相同文件不打印:与Size不同文件显示未排序)
#===============================================================================
import os, time,difflib
AFILES = [] #EE
BFILES = [] #SVN
COMMON = [] #EE & SVN
def getPrettyTime(state):
  return time.strftime('%y-%m-%d %H:%M:%S', time.localtime(state.st_mtime))
# def getpathsize(dir): #获取文件大小的函数,未用上,仅供学习.故注释掉
#   size=0
#   for root, dirs, files in os.walk(dir):
#   #root:目录:str 如: C:\CopySVN\SystemObject\TopoProcedure\Built-in\
#   #dirs:目录名称:列表: 如 ['Parsers']
#   #files:名称:列表: 如 ['011D0961FB42416AA49D5E82945DE7E9.og',...]
#   #file:目录:str, 如 011D0961FB42416AA49D5E82945DE7E9.og
#     for file in files:
#       path = os.path.join(root,file)
#       size = os.path.getsize(path)
#   return size
def dirCompare(apath,bpath):
  afiles = []
  bfiles = []
  for root, dirs , files in os.walk(apath):
    for f in files:
      afiles.append(root + "\\" + f)
  for root, dirs , files in os.walk(bpath):
    for f in files:
      bfiles.append(root + "\\" + f)
      #sizeB = os.path.getsize(root + "\\" + f) 此处定义的size无法在commonfiles进行比较. (A,B在各自的循环里面)
  # 去掉afiles中文件名的apath (拿A,B相同的路径\文件名,做成集合,去找交集)
  apathlen = len(apath)
  aafiles = []
  for f in afiles:
    aafiles.append(f[apathlen:])
  # 去掉bfiles中文件名的bpath
  bpathlen = len(bpath)
  bbfiles = []
  for f in bfiles:
    bbfiles.append(f[bpathlen:])
  afiles = aafiles
  bfiles = bbfiles
  setA = set(afiles)
  setB = set(bfiles)
  #print('%$%'+str(len(setA)))
  #print('%%'+str(len(setB)))
  commonfiles = setA & setB # 处理共有文件
  #print ("===============File with different size in '", apath, "' and '", bpath, "'===============")
  #将结果输出到本地
  #with open(os.getcwd()+'diff.txt','w') as di:
    #di.write("===============File with different size in '", apath, "' and '", bpath, "'===============")
  for f in sorted(commonfiles):
    sA=os.path.getsize(apath + "\\" + f)
    sB=os.path.getsize(bpath + "\\" + f)
    if sA==sB: #共有文件的大小比较
      #pass #print (f + "\t\t" + getPrettyTime(os.stat(apath + "\\" + f)) + "\t\t" + getPrettyTime(os.stat(bpath + "\\" + f)))
      #以下代码是处理大小一致,但是内容可能不一致的情况
      #print("in sa=sb")
      #print(os.getcwd())
      saf=[]
      sbf=[]
      sAfile=open(apath + "\\" + f)
      iter_f=iter(sAfile)
      for line in iter_f:
        saf.append(line)
      sAfile.close()
      sBfile=open(bpath + "\\" + f)
      iter_fb=iter(sBfile)
      for line in iter_fb:
        sbf.append(line)
      sBfile.close()
      saf1=sorted(saf)
      sbf1=sorted(sbf)
      if(len(saf1)!=len(sbf1)):
        with open(os.getcwd()+'\\comment_diff.txt','a') as fp:
          print(os.getcwd())
          fp.write(apath + "\\" + f+" lines size not equal "+bpath + "\\" + f+'\n')
      else:
        for i in range(len(saf1)):
          #print("into pre")
          if(saf1[i]!=sbf1[i]):
            print('into commont')
            with open(os.getcwd()+'\\comment_diff.txt','a') as fp1:
              fp1.write(apath + "\\" + f+" content not equal "+bpath + "\\" + f+'\n')
              break
    else:
      with open (os.getcwd()+'\\diff.txt','a') as di:
        di.write("File Name=%s  EEresource file size:%d  != SVN file size:%d" %(f,sA,sB)+'\n')
      #print ("File Name=%s  EEresource file size:%d  != SVN file size:%d" %(f,sA,sB))
  # 处理仅出现在一个目录中的文件
  onlyFiles = setA ^ setB
  aonlyFiles = []
  bonlyFiles = []
  for of in onlyFiles:
    if of in afiles:
      aonlyFiles.append(of)
    elif of in bfiles:
      bonlyFiles.append(of)
  #print ("###################### EE resource ONLY ###########################")
  #print ("#only files in ", apath)
  for of in sorted(aonlyFiles):
    with open (os.getcwd()+'\\EEonly.txt','a') as ee:
      ee.write(of+'\n')
    #print (of)
  #print ("*"*20+"SVN ONLY+"+"*"*20)
  #print ("#only files in ", bpath)
  for of in sorted(bonlyFiles):
    with open (os.getcwd()+'\\svnonly.txt','a') as svn:
      svn.write(of+'\n')
    #print (of)
if __name__ == '__main__':
  FolderEE = 'D:\\search\\bb\\ObjectGroup - Copy\\ObjectGroup\\Built-in'
  FolderSVN = 'D:\\search\\bb\\ObjectGroup\\ObjectGroup\\Built-in'
  dirCompare(FolderEE, FolderSVN)
  print("done!")
Python 相关文章推荐
Python连接mysql数据库的正确姿势
Feb 03 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
python list格式数据excel导出方法
Oct 31 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
使用python turtle画高达
Jan 19 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
详解python中的异常捕获
Dec 15 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 #Python
回调函数的意义以及python实现实例
Jun 20 #Python
Python处理Excel文件实例代码
Jun 20 #Python
python构建自定义回调函数详解
Jun 20 #Python
Python实现完整的事务操作示例
Jun 20 #Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
Python实现多并发访问网站功能示例
Jun 19 #Python
You might like
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
PHP7 windows支持
2021/03/09 PHP
5个JavaScript经典面试题
2014/10/13 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python 修改本地网络配置的方法
2019/08/14 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
行政专员岗位职责
2014/01/02 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
实习单位推荐信
2015/03/27 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby