본문 바로가기
개발/파이썬

[파이썬] 주어진 폴더 파일/크기 비교 예제

by esstory 2017. 10. 11.

사진과 동영상을 백업받을 새로운 하드를 장만하면서 약 10만개가 넘는 사진을 두 하드에 복사하다가, 필요해서 만든 간단한 폴더 비교 샘플입니다 

(주의: 파일 자체의 내용까지 비교 해주는 좋은 사용 툴이 있지만, 바이너리 파일 비교는 너무 오래 걸려 파이썬 공부 목적으로 만든 참고용 예제임)

목적: 

주어진 폴더 2개를 비교

동일한 파일(파일 이름과 크기만 비교), 한쪽에만 있는 파일,  오른쪽에만 있는 파일 리스트를 구한다

 

프로그램 코드

import os
 
# 주어진 folder 2개를 look up 한 후
# 파일 이름/사이즈까지 비교
 
 
path1 = "H:\\5. 사진\\"
path2 = "G:\\5. 사진\\"
 
# key: full path value: filename, folder/file, file size
gfilemap1 = {}
gfilemap2 = {}
 
def listallFile(path, map, defPath) :
    for fname in os.listdir(path) :
        fullname = os.path.join(path, fname)
        if os.path.isdir(fullname) :
            key = fullname
            key = key.replace(defPath, '')
            map[key] = [fname, 'folder', 0]
            listallFile(fullname, map, defPath)
        else:
            size = os.path.getsize(fullname)
            key = fullname
            key = key.replace(defPath, '')
            map[key] = [fname, 'file', size]
 
if __name__ == "__main__":
    # path1 의 모든 폴더/서버폴더/파일 목록 계산
    listallFile(path1, gfilemap1, path1)
    # path2 의 모든 폴더/서버폴더/파일 목록 계산
    listallFile(path2, gfilemap2, path2)
 
    print(len(gfilemap1))
    print(len(gfilemap2))
 
    samefile = []
    leftOnlyFile = []
    rightOnlyFile  = []
    diffFile = []
 
    # 두 군데 모두 있는 파일인 경우 파일 사이즈 비교해서 동일 여부 판단
    for key, value in gfilemap1.items():
        if key in gfilemap2.keys():
            if value[1] == gfilemap2[key][1] and value[2] == gfilemap2[key][2] :
                samefile.append(key)
                continue
            else:
                diffFile.append(key)
                print(key, value[1], value[2], gfilemap2[key][1], gfilemap2[key][2])
                continue
        else:
            leftOnlyFile.append(key)
 
    # path2 에만 있는 파일 여부 확인
    for key, value in gfilemap2.items():
        if not (key in gfilemap1.keys()):
            rightOnlyFile.append(key)
 
 
    print('same files', len(samefile))
    print('left only files', len(leftOnlyFile))
    print('right only files', len(rightOnlyFile))
    print('diff files', len(diffFile))

댓글