#-*-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实现两个文件夹里文件的对比(包含内容的对比)的更多相关文章

  1. D盘Program Files 文件夹里文件不显示,没隐藏。怎么才能显示出来?

    D盘里有两个一模一样的Program Files 文件夹,文件夹里文件不显示,没隐藏.怎么才能显示出来?新买不久的电脑,win8.1系统 点击开始---运行---输入“cmd”(没有引号)---在弹出 ...

  2. VBA读取文件夹下所有文件夹及文件内容,并以树形结构展示

    Const TR_LEVEL_MARK = "+"Const TR_COL_INDEX = "A"Const TR_COL_LEVEL = "E&qu ...

  3. python 批量创建文件及文件夹(文件夹里再创文件)

    python 批量创建文件及文件夹(文件夹里再创文件)思路:文件建到哪>文件名字叫啥>创建文件夹>去新建的文件下>新建文件>给文件里边写东西>写个反馈给控制台> ...

  4. diff两个文件夹里的东西

    diff --help -x, --exclude=PAT               exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --uni ...

  5. python 计算文件夹里所有内容的大小总和

    计算文件夹里所有内容的大小总和 递归方法 '''计算文件夹的大小''' import os def dir_file_size(path): if os.path.isdir(path): file_ ...

  6. Python 文件夹及文件操作

    import os import os.path from shutil import copy def copyfile(src, dst): count = 1 for filename in o ...

  7. Python学习(九)IO 编程 —— 文件夹及文件操作

    Python 文件夹及文件操作 我们经常会与文件和目录打交道,对于这些操作,python可以使用 os 及 shutill 模块,其中包含了很多操作文件和目录的函数. os 可以执行简单的文件夹及文件 ...

  8. OpenCV玩耍(一)批量resize一个文件夹里的所有图像

    鉴于用caffe做实验的时候,里面牵扯到一个问题是必须将训练集和测试集都转成256*256的图像,而官网给出的代码又不会用,所以我用opencv转了.其实opencv只转一幅图会很简单,关键在于“批量 ...

  9. (转)android res文件夹里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

    android res文件夹里面的drawable(ldpi.mdpi.hdpi.xhdpi.xxhdpi) (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),F ...

随机推荐

  1. 深入浅出Node.js(上)

    (一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...

  2. UI控件之UIImageView

    UIImageView:图像视图,用于在应用程序中显示图片 UIImage:是将图片文件转换为程序中的图片对象 UIImageView是UIImage的载体 方法一:用此方法创建图片对象,会将图片ca ...

  3. ETL应用:使用Pro*C实现文件抽取的方法

    /******************************************* ***** 函数功能 : ***** 抽取数据库记录 ***** ********************** ...

  4. oracle长连接超时设置

    方法一.在sqlnet.ora中设置参数 如需要设置客户端空闲10分钟即被中断,则在sqlnet.ora的末尾添加SQLNET.EXPIRE_TIME=10注:sqlnet.ora文件的路径在$ORA ...

  5. PHP面试题汇总一

    1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别? 答 ...

  6. 2017最全的php面试题目及答案总结

    最近在网上看到很多的小伙伴们都在询问如何应对php面试,这个对于有工作经验和实战项目的小伙伴来说是没什么问题的,但是对于刚刚学习完php的小伙伴们.php面试却是一个很重要的一步,那么今天php中文网 ...

  7. WKWebview的基本使用

    在开发过程中,iOS 中实现加载 web 页面主要有两种控件,UIWebView 和 WKWebview,两种控件对应具体的实现方法不同.WKWebView是苹果公司在iOS8系统推出的,这里主要概述 ...

  8. Git使用http clone客户端保存用户名密码

    使用Git Bash时,用命令git pull或git push时总是要输入密码,很烦躁 解决办法 需要注意的是,这个方法是在Windows下使用 1. 新建环境变量   HOME 值为 %USERP ...

  9. eclipse异常关了,tomcat如何关

    eclipse异常关了,tomcat如何关 ? 1.bin文件夹下面有的shutdown.bat.双击即可! 2.在任务管理器里面关闭,看到javaw.exe关闭也行.            

  10. EF Code-First 学习之旅 Fluent API

    Mappings To Database Model-wide Mapping Set default Schema Set Custom Convetions Entity Mapping To S ...