本文实例讲述了Python编程实现两个文件夹里文件的对比功能。分享给大家供大家参考,具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#-*-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程序设计有所帮助。