Python 比較兩個(gè)文件夾中的文件是否相同?

思路:

  1. 源文件或文件夾夾與目標(biāo)不同名的文件有那些区赵?
  2. 源文件或文件夾夾與目標(biāo)同名的情況:
    a)文件同名惭缰,比較文件內(nèi)容是否相同?
    b)文件夾同名笼才,比較共有文件的內(nèi)容
    c)文件同名漱受,但是內(nèi)容不同
    程序1:找出兩個(gè)文件目錄中不同的部分
'''
比較兩個(gè)目錄里文件是否一致?
1.要列出2個(gè)文件夾中所有的文件骡送;
2.相互做比較昂羡;
3.把比較的結(jié)果以報(bào)告的形式呈現(xiàn)
'''

import os,sys

def reportdiff(unique1,unique2,dir1,dir2):
    '''
    生成目錄差異化報(bào)告
    '''
    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中的所有項(xiàng)
    '''
    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():
    '''
    獲取參數(shù)
    '''
    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: 增加文件內(nèi)容的比較

import os,dirdiff

blocksize = 1024*1024

def intersect(seq1,seq2):
    '''
    返回seq1和seq2中的所有共有項(xiàng)絮记;
    '''
    return [item for item in seq1 if item in seq2]

def comparetrees(dir1,dir2,diffs,verbose=False):
    '''
    比較兩個(gè)目錄中的所有子目錄和文件;使用二進(jìn)制文件來阻止Unicode解碼和換行符轉(zhuǎn)換虐先;
    因?yàn)槟夸洏淇赡芎卸M(jìn)制文件和文本文件怨愤;
    可能需要listdir的bytes參數(shù)來處理某些平臺行不可解碼的文件名
    '''
    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[:]

    #比較共有文件內(nèi)容
    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)

    #同名但一個(gè)是文件,一個(gè)是目錄
    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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛹批,一起剝皮案震驚了整個(gè)濱河市憔四,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌般眉,老刑警劉巖了赵,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甸赃,居然都是意外死亡柿汛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門埠对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來络断,“玉大人,你說我怎么就攤上這事项玛∶脖浚” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵襟沮,是天一觀的道長锥惋。 經(jīng)常有香客問我,道長开伏,這世上最難降的妖魔是什么膀跌? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮固灵,結(jié)果婚禮上捅伤,老公的妹妹穿的比我還像新娘。我一直安慰自己巫玻,他們只是感情好丛忆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仍秤,像睡著了一般熄诡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徒扶,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天粮彤,我揣著相機(jī)與錄音,去河邊找鬼姜骡。 笑死导坟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圈澈。 我是一名探鬼主播惫周,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼康栈!你這毒婦竟也來了递递?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤啥么,失蹤者是張志新(化名)和其女友劉穎登舞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬荣,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菠秒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氯迂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片践叠。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚼蚀,靈堂內(nèi)的尸體忽然破棺而出禁灼,到底是詐尸還是另有隱情,我是刑警寧澤轿曙,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布弄捕,位于F島的核電站,受9級特大地震影響导帝,放射性物質(zhì)發(fā)生泄漏察藐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一舟扎、第九天 我趴在偏房一處隱蔽的房頂上張望分飞。 院中可真熱鬧,春花似錦睹限、人聲如沸譬猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽染服。三九已至,卻和暖如春叨恨,著一層夾襖步出監(jiān)牢的瞬間柳刮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秉颗,地道東北人痢毒。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚕甥,于是被迫代替她去往敵國和親哪替。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348