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 相关文章推荐
Django中对数据查询结果进行排序的方法
Jul 17 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python turtle库画一个方格和圆实例
Jun 27 Python
python3 线性回归验证方法
Jul 09 Python
python系列 文件操作的代码
Oct 06 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
pandas抽取行列数据的几种方法
Dec 13 Python
使用Pytorch训练two-head网络的操作
May 28 Python
python实现手机推送 代码也就10行左右
Apr 12 Python
Django框架模板用法详解
Jun 10 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
基于文本的留言簿
2006/10/09 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
php多进程应用场景实例详解
2019/07/22 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python实现字典依据value排序
2016/02/24 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
python简单贪吃蛇开发
2019/01/28 Python
使用python绘制温度变化雷达图
2019/10/18 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
EJB的基本架构
2016/09/22 面试题
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
自我工作评价范文
2015/03/06 职场文书
中标通知书
2015/04/17 职场文书
初中军训感想
2015/08/07 职场文书