filecmp — 파일 및 디렉터리 비교
filecmp — 파일 및 디렉터리 비교
filecmp 모듈은 다양한 선택적인 시간/정확성 트레이드오프로 파일과 디렉터리를 비교하는 함수를 정의해요. 파일 비교에 대해서는 difflib 모듈도 참고하세요.
출처: Python 표준 라이브러리
본문
filecmp 모듈은 다음 함수들을 정의해요.
filecmp.cmp(f1, f2, shallow=True)
f1과 f2라는 이름의 파일을 비교해서 같아 보이면 True, 아니면 False를 돌려줘요.
shallow가 참이고 두 파일의 os.stat() 시그니처(파일 타입, 크기, 수정 시각)가 동일하면 두 파일은 같다고 간주해요.
그렇지 않으면 크기나 내용이 다르면 서로 다르다고 처리해요.
이 함수는 외부 프로그램을 호출하지 않아서 이식성과 효율성이 좋다는 점을 기억해 두세요.
이 함수는 과거 비교와 결과를 캐시하는데, 파일의 os.stat() 정보가 바뀌면 캐시 항목이 무효화돼요. 전체 캐시는 clear_cache()로 지울 수 있어요.
filecmp.cmpfiles(a, b, common, shallow=True)
두 디렉터리 a와 b에서 common에 주어진 이름의 파일들을 비교해요.
파일 이름 세 개의 리스트(match, mismatch, errors)를 돌려줘요. match는 일치하는 파일 목록, mismatch는 일치하지 않는 파일 이름, errors는 비교할 수 없었던 파일 이름 목록이에요. 파일이 한 디렉터리에 없거나, 읽을 권한이 없거나, 다른 이유로 비교가 불가능하면 errors에 나열돼요.
shallow 매개변수는 filecmp.cmp()와 같은 의미와 기본값을 가져요.
예를 들어 cmpfiles('a', 'b', ['c', 'd/e'])는 a/c와 b/c, a/d/e와 b/d/e를 비교해요. 'c'와 'd/e' 각각은 반환된 세 리스트 중 하나에 들어가요.
filecmp.clear_cache()
filecmp 캐시를 지워요. 파일이 수정된 직후 너무 빨리 비교돼서 기본 파일시스템의 mtime 해상도 안에 들어올 때 유용할 수 있어요.
버전 3.4에 추가됨.
dircmp 클래스
class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)
디렉터리 a와 b를 비교하는 새 디렉터리 비교 객체를 만든다. ignore는 무시할 이름들의 목록이고, 기본값은 filecmp.DEFAULT_IGNORES예요. hide는 숨길 이름들의 목록이고 기본값은 [os.curdir, os.pardir]이에요.
dircmp 클래스는 기본적으로 filecmp.cmp()에서 설명한 대로 shallow 매개변수를 사용해 얕은 비교로 파일을 비교해요.
버전 3.13에서 변경: shallow 매개변수 추가.
dircmp 클래스는 다음 메서드들을 제공해요.
report()— (sys.stdout으로)a와b의 비교 결과를 출력해요.report_partial_closure()—a와b, 그리고 공통의 직접 하위 디렉터리에 대한 비교 결과를 출력해요.report_full_closure()—a와b, 그리고 (재귀적으로) 공통 하위 디렉터리에 대한 비교 결과를 출력해요.
dircmp 클래스는 비교되는 디렉터리 트리에 대한 여러 정보 bit를 얻는 데 쓸 수 있는 흥미로운 속성들을 제공해요. __getattr__() 훅을 통해 모든 속성이 지연 계산되므로, 가벼운 속성만 사용한다면 속도 손실이 없어요.
left— 디렉터리a.right— 디렉터리b.left_list—hide와ignore로 필터링한a의 파일·하위 디렉터리.right_list—hide와ignore로 필터링한b의 파일·하위 디렉터리.common—a와b양쪽에 있는 파일·하위 디렉터리.left_only—a에만 있는 파일·하위 디렉터리.right_only—b에만 있는 파일·하위 디렉터리.common_dirs—a와b양쪽에 있는 하위 디렉터리.common_files—a와b양쪽에 있는 파일.common_funny—a와b양쪽에 있지만 디렉터리 간에 타입이 다르거나os.stat()이 오류를 보고하는 이름.same_files— 클래스의 파일 비교 연산자를 사용해 양쪽에서 동일한 파일.diff_files—a와b양쪽에 있지만 내용이 다른 것으로 판정된 파일.funny_files—a와b양쪽에 있지만 비교할 수 없었던 파일.subdirs—common_dirs의 이름을dircmp인스턴스(dircmp의 하위 클래스인MyDirCmp타입이라면MyDirCmp인스턴스)로 매핑하는 딕셔너리.
버전 3.10에서 변경: 이전에는 항목이 항상 dircmp 인스턴스였어요. 이제 self가 dircmp의 하위 클래스라면 항목이 self와 같은 타입이 돼요.
filecmp.DEFAULT_IGNORES
dircmp가 기본적으로 무시하는 디렉터리 목록.
버전 3.4에 추가됨.
여기 subdirs 속성을 사용해 두 디렉터리를 재귀적으로 탐색하며 공통인 다른 파일을 보여 주는 간단한 예제가 있어요.
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
... for name in dcmp.diff_files:
... print("diff_file %s found in %s and %s" % (name, dcmp.left,
... dcmp.right))
... for sub_dcmp in dcmp.subdirs.values():
... print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)