사진과 동영상을 백업받을 새로운 하드를 장만하면서 약 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))
'개발 > 파이썬' 카테고리의 다른 글
[파이썬] 리스트/딕셔너리 정렬하기 (0) | 2017.12.11 |
---|---|
[파이썬] Creon Plus 를 이용해서 KOSPI200 종목 시세 가져오기 (0) | 2017.10.15 |
[파이썬] 안드로이드 프로젝트에서 자바 클래스 레퍼런스 카운트 구하기 (0) | 2017.10.14 |
[파이썬] 폴더 명 일괄 변경 예제 (0) | 2017.10.11 |
파이썬 기본 - 리스트/딕셔너리/튜플/set 기본 사용법 (0) | 2017.09.26 |
파이썬 개발 환경 구축 하기 (0) | 2017.09.25 |
댓글