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执行等待程序直到第二天零点的方法
Apr 23 Python
Python中字符串对齐方法介绍
May 21 Python
python实现自动登录人人网并采集信息的方法
Jun 28 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
python批量修改文件编码格式的方法
May 31 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
python自动下载图片的方法示例
Mar 25 Python
python内置模块之上下文管理contextlib
Jun 14 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&&mysql)一
2006/10/09 PHP
php&java(三)
2006/10/09 PHP
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php导出excel格式数据问题
2014/03/11 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
PHP防盗链代码实例
2014/08/27 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
windows 下python+numpy安装实用教程
2017/12/23 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python函数定义和调用过程详解
2020/02/09 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
承诺书范文
2014/06/03 职场文书
2014年度个人总结范文
2015/03/09 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android