使用python实现两个文件夹里文件的对比(包含内容的对比)

#-*-coding:utf-8-*-    

#===============================================================================  # 目录对比工具(包含子目录 ),并列出# 1、A比B多了哪些文件  # 2、B比A多了哪些文件  # 3、二者相同的文件:文件大小相同 VS 文件大小不同  (Size相同文件不打印:与Size不同文件显示未排序)#===============================================================================  

import os, time,difflib

AFILES = []  #EEBFILES = []  #SVNCOMMON = []  #EE & SVNdef 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!")
时间: 2024-07-29 23:59:36

使用python实现两个文件夹里文件的对比(包含内容的对比)的相关文章

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

Const TR_LEVEL_MARK = "+"Const TR_COL_INDEX = "A"Const TR_COL_LEVEL = "E"Const TR_COL_NAME = "C"Const TR_COL_COUNT = "D"Const TR_COL_TREE_START = "F"Const TR_ROW_HEIGHT = 23Const TR_COL_LINE_WIDT

利用python找出两文件夹里相同的文件并保存在新的文件夹下(分三种情况)

原文件夹A,B,新文件夹C,下图中的情况以图片为例 A:00001.jpg  00002.jpg   00003.jpg  00147.jpg B : 00001.jpg  000000002.jpg   00147.json 第一种情况:找出两文件夹下相同内容的文件,保存并输出到文件夹C 思路:判断内容是否一致,因此需要读取整个文件,判断两者是否一样 由于文件内容错综复杂,而其md5是唯一的,如果两者内容一致,则两者的md5值应该为一样.由于图片是二进制存储,在读取时采用'rb'.这里是对文件

diff两个文件夹里的东西

diff --help -x, --exclude=PAT               exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context 输入行好 -N, --new-file                  treat absent files as empty 如果某个文件只在一个地方有,就把这个文件当作不存

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

Python 文件夹及文件操作 我们经常会与文件和目录打交道,对于这些操作,python可以使用 os 及 shutill 模块,其中包含了很多操作文件和目录的函数.这边,仅介绍通常会用到的方法. os 可以操作简单的文件夹及文件操作,引入用  import os,可用  help(os)  或是  dir(os)  查看其用法.注意有些函数在os模块中,有的是在os.path模块中. shutil 模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.须

Python 文件夹及文件操作

我们经常会与文件和目录打交道,对于这些操作,python可以使用 os 及 shutill 模块,其中包含了很多操作文件和目录的函数. os 可以执行简单的文件夹及文件操作,引入用  import os,可用  help(os)  或是  dir(os)  查看其用法.注意有些函数在os模块中,有的是在os.path模块中. shutil 模块提供了大量的文件的高级操作,特别针对文件拷贝和删除.主要功能为目录和文件操作以及压缩操作.须引入 import shutil  ,具体 help.本文仅介

oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2.0\oradata\gqxt),重新命名即可,我命名为gqxt_old,(否则装数据库的时候会提示sid已存在). 2,重新安装数据库到原来的路径(不安装到原来的路径也没关系,但是原来的数据库文件必须在原来的路径不能变,也就是oradata\gqxt所在的路径不能变),数据库的名字就是你要恢复的名字

python 实现彻底删除文件夹和文件夹下的文件

python 中有很多内置库可以帮忙用来删除文件夹和文件,当面对要删除多个非空文件夹,并且目录层次大于3层以上时,仅使用一种内置方法是无法达到彻底删除文件夹和文件的效果的,比较low的方式是多次调用直到删除.但是,我们可以结合多个内置库函数,达到一次删除非空文件夹,不管其目录层次有多深. import os import shutil import traceback import globalvar def misc_init() # clean the test result folder

su认证失败&文件夹里打开终端的方法&atom安装

很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了.一步一步来.先解决最不顺手的三件事 1.su认证失败. 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 sudo passwd 密码: 输入新的UNIX密码: 确认密码: 这样就可以了 2.文件夹里打开终端 sudo apt-get install nautilus-open-terminal 然后nautilus -q重新加载文件管理器,或注销登陆即可生效. 3.安装atom编辑器 sudo add-

Python文件夹与文件的操作 ZZ

最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模块, 导入的方法是: import os 一.取得当前目录 s = os.getcwd() # s 中保存的是当前目录(即文件夹) 比如运行abc.py,那么输入该命令就会返回abc所在的文件夹位置. 举个简单例子,我们将abc.py放入A文件夹.并且希望不管将A文件夹放在硬盘的哪个位置,都可以在A