#-*-coding:utf-8-*-    
 
#===============================================================================  
# 目录对比工具(包含子目录 ),并列出
# 1、A比B多了哪些文件  
# 2、B比A多了哪些文件  
# 3、二者相同的文件:文件大小相同 VS 文件大小不同  (Size相同文件不打印:与Size不同文件显示未排序)
# 4、可通过修改,比较文件名且包含文件格式或者只比较文件名但不包括格式后缀。
#===============================================================================  
 
import os, time,difflib,sys

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):
        print apath,'All files numbers:',len(files)
        for f in files:
            #比较文件名不含格式后缀
            #afiles.append(root + f[0:-4])
            
            #比较文件名含格式后缀
            afiles.append(root + f)
    for root, dirs , files in os.walk(bpath):
        print bpath,'All files numbers:',len(files)
        for f in files:
            #比较文件名不含格式后缀
            #bfiles.append(root + f[0:-4])
            
            #比较文件名含格式后缀
            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 apath,'only files numbers:',len(aonlyFiles)
    print bpath,'only files numbers:',len(bonlyFiles)
    #print ("###################### EE resource ONLY ###########################")
    #print ("#only files in ", apath)
    if os.path.exists(os.getcwd()+'/Aonly.txt'):
        os.remove(os.getcwd()+'/Aonly.txt')
    if os.path.exists(os.getcwd()+'/Bonly.txt'):
        os.remove(os.getcwd()+'/Bonly.txt')

for of in sorted(aonlyFiles):
        with open (os.getcwd()+'/Aonly.txt','a') as a:
            a.write(of+'\n')

#print (of)
    #print ("*"*20+"SVN ONLY+"+"*"*20)
    #print ("#only files in ", bpath)
    for of in sorted(bonlyFiles):
        with open (os.getcwd()+'/Bonly.txt','a') as b:
            b.write(of+'\n')
        #print (of)

if __name__ == '__main__':
    FolderEE = sys.argv[1]
    FolderSVN = sys.argv[2]
    dirCompare(FolderEE, FolderSVN)
    print("done!")

ps:本文参考 http://www.cnblogs.com/luo-mao/p/5872532.html 猫儿爹,经修改符合自身使用,感谢作者。

转载于:https://www.cnblogs.com/yangwithtao/p/6937349.html

python 比较两文件夹的内容,具有通用性。相关推荐

  1. Python批量复制文件夹及其内容、并按Excel表格遍历重命名文件夹

    一.先准备好母本: 1.要复制的文件夹:如下图 2.要复制后命名的工作薄:如下图 工作薄1内容: 二.敲代码: import shutil import pandas as pd 待命名=pd.rea ...

  2. 如何在同一台电脑上保持两个文件夹的内容同步更新?

    很多时候我们因工作需要,想要在同一台电脑上保持两个文件夹的内容文件同步更新,保持一致.那么除了人工手动复制粘贴,还有其他方法吗?今天小西就给大家介绍一款文件同步备份软件,可实现两个文件夹文件自动同步更 ...

  3. python中按照文件夹中文件的排列顺序读取文件内容,python文件显示和windows目录显示一致

    原创 python中按照文件夹中文件的排列顺序读取文件内容 2018-12-06 11:49:18 途径北海道 阅读数 3891 更多 分类专栏: python 版权声明:本文为博主原创文章,遵循 C ...

  4. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法

    本文采用os.walk()和os.listdir()两种方法,获取指定文件夹下的文件名. 一.os.walk() 模块os中的walk()函数可以遍历文件夹下所有的文件. os.walk(top, t ...

  5. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解

    前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...

  6. python 打开当前目录的txt文件-Python - 读取其他文件夹/目录中的文本文件

    这是我的情况:我有一些.txt文件在我可以运行脚本的不同目录中.Python - 读取其他文件夹/目录中的文本文件 mainDir/ -face/ -57268-face-_tracker.txt - ...

  7. python遍历指定文件夹的所有文件_python 统计指定文件夹下所有的文件数量,BFS方式...

    python 统计指定文件夹下所有的文件数量 本来一直是有这个需求,只是以前写的是递归的方式处理,感觉对资源的占用不友好,而且python的最大递归深度不超过1000,所以改了一下,这里用广度优先遍历 ...

  8. python删除指定文件夹下文件和文件夹的方法

    python删除指定文件夹下的文件,是一个常用的功能.我找了不少地方,一直没有找到合适的模版,那只好自己倒腾一个比较实用的模版了. 基本模块 这里面会用到几个模块,一个是目录下所有文件的的函数:lis ...

  9. Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容...

    Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容 Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容 - IGod接口 - 博客园 P ...

  10. debian 文件夹中文件大小_linux查看目录(文件夹)内容大小

    习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示 ...

最新文章

  1. Maya人物角色行走动画制作视频教程
  2. 使用RSA算法生成令牌
  3. Django(part20)--数据库和模型
  4. Scala闭包特性的一个测试
  5. 数据中台应该具备的能力
  6. Hibernate的查询 HQL查询 查询某几列
  7. 《深入理解Java虚拟机》第3章 GC与内存分配策略
  8. LEADTOOLS v19试用版安装指南图文详解
  9. XP中轻松获取未使用的IP地址
  10. cad项目数据库服务器,cad项目数据库服务器
  11. 【华为机试题 HJ22】汽水瓶
  12. 【java面试经(架构师设计师)-第4课】java基础常识
  13. 用微课学计算机应用基础--PPT制作
  14. bioRxiv|利用机器智能设计抗新型冠状病毒药物
  15. MySQL原理与实践(二):一条update语句引出MySQL日志系统
  16. LeetCode——解数独
  17. STM32F4驱动LTC2664-16驱动程序
  18. 程序员很少上《非诚勿扰》电视节目相亲之分析
  19. Proteus 创建可以仿真的元件 - Proteus建模技术
  20. 计算机表格判断是否合格操作,关于一些刚开始接触计算机的基础知识(2)

热门文章

  1. 博客访问量,有没有可能是系统所为?
  2. 什么年代了,买硬盘不论T?
  3. 开源:OpenJDK8 AARCH64(ARM)
  4. std::map,不同的插入方式,会导致崩溃
  5. UBUNTU使用GITHUB
  6. java long 1 000_Java-基本数据类型
  7. java session重复登录_Java开发网 - Hibernate:session中对象重复问题的解决方法(原创)...
  8. vue3 eslint吐槽记录
  9. mysql 5.1.71_MySQL升级从5.1.71到5.7.17
  10. python opencv中的imwrite函数_python – OpenCV imwrite函数导致’undefined symbol’