python两个文件比较_Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】...

本文实例讲述了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!")

PS:这里再为大家推荐一款功能相似的在线工具供大家参考使用:

希望本文所述对大家Python程序设计有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值