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

思路:

  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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345