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读文件逐行处理的示例代码分享
Dec 27 Python
Python构造函数及解构函数介绍
Feb 26 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Python实现线程状态监测简单示例
Mar 28 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
Python sublime安装及配置过程详解
Jun 29 Python
90行Python代码开发个人云盘应用
Apr 20 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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新手入门学习方法
2011/05/08 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python实现按中文排序的方法示例
2018/04/25 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
一百多行python代码实现抢票助手
2018/09/25 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python pillow模块使用方法详解
2019/08/30 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
详解python中各种文件打开模式
2020/01/19 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
EJB的激活机制
2013/10/25 面试题
公司清洁工岗位职责
2013/12/14 职场文书
秘书专业自荐信范文
2013/12/26 职场文书
幼儿发展评估方案
2014/06/11 职场文书
2015年体育教学工作总结
2015/05/20 职场文书