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 系统调用的实例详解
Jul 11 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
pandas 读取各种格式文件的方法
Jun 22 Python
anaconda如何查看并管理python环境
Jul 05 Python
Python socket非阻塞模块应用示例
Sep 12 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
django 模型中的计算字段实例
May 19 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python如何输出反斜杠
Jun 18 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
python文件与路径操作神器 pathlib
Apr 01 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
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php链表用法实例分析
2015/07/09 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
JS实现简单打字测试
2020/06/24 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python中MySQLdb模块用法实例
2014/11/10 Python
Python脚本处理空格的方法
2016/08/08 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
python中的常量和变量代码详解
2018/07/25 Python
python增加图像对比度的方法
2019/07/12 Python
python实现复制文件到指定目录
2019/10/16 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
python不同系统中打开方法
2020/06/23 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
篮球社团活动总结
2014/06/27 职场文书
股东授权委托书范本
2014/09/13 职场文书
法院授权委托书格式
2014/09/28 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
财务检查整改报告
2014/11/06 职场文书
文言文辞职信
2015/02/28 职场文书
工作简历自我评价
2015/03/11 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android