美文网首页
Python 比较两个文件夹中的文件是否相同?

Python 比较两个文件夹中的文件是否相同?

作者: 喵呜e喵星人 | 来源:发表于2020-08-30 22:58 被阅读0次

    思路:

    1. 源文件或文件夹夹与目标不同名的文件有那些?
    2. 源文件或文件夹夹与目标同名的情况:
      a)文件同名,比较文件内容是否相同?
      b)文件夹同名,比较共有文件的内容
      c)文件同名,但是内容不同
      程序1:找出两个文件目录中不同的部分
    '''
    比较两个目录里文件是否一致?
    1.要列出2个文件夹中所有的文件;
    2.相互做比较;
    3.把比较的结果以报告的形式呈现
    '''
    
    import os,sys
    
    def reportdiff(unique1,unique2,dir1,dir2):
        '''
        生成目录差异化报告
        '''
        if not (unique1 or unique2):
            print("Directory lists are identical")
        else:
            if unique1:
                print('Files unique to:',dir1)
                for file in unique1:
                    print('....',file)
            if unique2:
                print('Files unique to:',dir2)
                for file in unique2:
                    print('.........',file)
    
    
    def difference(seq1,seq2):
        '''
        仅返回seq1中的所有项
        '''
        return [item for item in seq1 if  item not in seq2]
    
    def comparedirs(dir1,dir2,files1=None,files2=None):
        '''
        比较文件的名字
        '''
        print('Comparing...',dir1,'to....',dir2)
        files1 = os.listdir(dir1) if files1 is None else files1
        files2 = os.listdir(dir2) if files2 is None else files2
        unique1 = difference(files1,files2)
        unique2 = difference(files2,files1)
        reportdiff(unique1,unique2,dir1,dir2)
        return not(unique1,unique2)
    
    def getarg():
        '''
        获取参数
        '''
        try:
            dir1,dir2 = sys.argv[1:]
        except:
            print("Usage: dirdiff.py dir1 dir2")
            sys.exit(1)
        else:
            return (dir1,dir2)
    
    if __name__=='__main__':
        dir1,dir2 = getarg()
        comparedirs(dir1,dir2)
    
    

    程序2: 增加文件内容的比较

    import os,dirdiff
    
    blocksize = 1024*1024
    
    def intersect(seq1,seq2):
        '''
        返回seq1和seq2中的所有共有项;
        '''
        return [item for item in seq1 if item in seq2]
    
    def comparetrees(dir1,dir2,diffs,verbose=False):
        '''
        比较两个目录中的所有子目录和文件;使用二进制文件来阻止Unicode解码和换行符转换;
        因为目录树可能含有二进制文件和文本文件;
        可能需要listdir的bytes参数来处理某些平台行不可解码的文件名
        '''
        print("--"*20)
        names1 = os.listdir(dir1)
        names2 = os.listdir(dir2)
        if not dirdiff.comparedirs(dir1,dir2,names1,names2):
            diffs.append('unique file at %s - %s ' %(dir1,dir2))
    
        print('Comparing contents')
        common = intersect(names1,names2)
        missed = common[:]
    
        #比较共有文件内容
        for name in common:
            path1 = os.path.join(dir1,name)
            path2 = os.path.join(dir2,name)
            if os.path.isfile(path1) and os.path.isfile(path2):
                missed.remove(name)
                file1 = open(path1,'rb')
                file2 = open(path2,'rb')
                while True:
                    byetes1 =file1.read(blocksize)
                    byetes2 = file2.read(blocksize)
                    if (not byetes1) and (not byetes2):
                        if verbose:print(name,'matches')
                        break
                    if byetes1 != byetes2:
                        diffs.append('files differ at %s --- %s ' %(path1,path2))
                        print(name,'DIFFERS')
                        break
        #递归以比较共有目录
        for name in common:
            path1 = os.path.join(dir1, name)
            path2 = os.path.join(dir2, name)
            if os.path.isdir(path1) and os.path.isdir(path2):
                missed.remove(name)
                comparetrees(path1,path2,diffs,verbose)
    
        #同名但一个是文件,一个是目录
        for name in missed:
            diffs.append('files missed at %s ---%s:%s' %(dir1,dir2,name))
            print(name,'DIFFERS')
    
    if __name__ =='__main__':
        dir1,dir2 = dirdiff.getarg()
        diffs = []
        comparetrees(dir1,dir2,diffs,True)
        print('='*40)
        if not diffs:
            print('No diffs found.')
        else:
            print('Diffs found: ',len(diffs))
            for diff in diffs:
                print('-',diff)
    

    相关文章

      网友评论

          本文标题:Python 比较两个文件夹中的文件是否相同?

          本文链接:https://www.haomeiwen.com/subject/tndysktx.html