filecmp — 파일과 디렉터리 비교
filecmp — 파일과 디렉터리 비교
filecmp 모듈은 다양한 선택적 시간/정확성 트레이드오프로 파일과 디렉터리를 비교하는 함수를 정의합니다. 파일 비교에 대해서는 difflib 모듈도 참조하세요.
본문
함수
filecmp.cmp(f1, f2, shallow=True) — f1과 f2라는 파일을 비교하여 같아 보이면 True, 아니면 False를 반환합니다. shallow가 true이고 두 파일의 os.stat() 시그니처(파일 타입, 크기, 수정 시간)가 동일하면 파일이 같다고 간주합니다. 그렇지 않으면 크기나 내용이 다르면 다르게 취급합니다. 이 함수는 외부 프로그램을 호출하지 않아 이식성과 효율성을 제공합니다.
이 함수는 과거 비교와 결과에 대한 캐시를 사용하며, 파일의 os.stat() 정보가 변경되면 캐시 항목이 무효화됩니다. 전체 캐시는 clear_cache()로 지울 수 있습니다.
filecmp.cmpfiles(a, b, common, shallow=True) — 이름이 common에 주어진 두 디렉터리 a와 b의 파일을 비교합니다. 세 개의 파일 이름 리스트, 즉 match, mismatch, errors를 반환합니다. match는 일치하는 파일, mismatch는 일치하지 않는 파일, errors는 비교할 수 없었던 파일을 담고 있습니다. 파일이 한 디렉터리에 없거나, 읽기 권한이 없거나, 다른 이유로 비교할 수 없으면 errors에 나열됩니다. 예: cmpfiles('a', 'b', ['c', 'd/e'])는 a/c와 b/c, a/d/e와 b/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 클래스는 기본적으로 shallow 매개변수를 사용해 filecmp.cmp()에서 설명한 대로 얕은 비교를 수행합니다 (3.13에서 shallow 매개변수 추가).
제공 메서드:
report()—a와b의 비교를sys.stdout에 출력합니다.report_partial_closure()—a와b및 공통 즉시 하위 디렉터리의 비교를 출력합니다.report_full_closure()—a와b및 공통 하위 디렉터리(재귀적으로)의 비교를 출력합니다.
유용한 속성들(__getattr__() 훅으로 모두 지연 계산되어 속도 손실 없음):
left— 디렉터리a.right— 디렉터리b.left_list—hide와ignore로 걸러진a의 파일과 하위 디렉터리.right_list—b의 파일과 하위 디렉터리.common—a와b모두의 파일과 하위 디렉터리.left_only—a에만 있는 파일과 하위 디렉터리.right_only—b에만 있는 것.common_dirs— 양쪽의 하위 디렉터리.common_files— 양쪽의 파일.common_funny— 양쪽에 있되 타입이 다르거나os.stat()이 오류를 보고하는 이름.same_files— 클래스의 파일 비교 연산자를 사용해 양쪽에서 동일한 파일.diff_files— 양쪽에 있되 내용이 다른 파일.funny_files— 양쪽에 있으나 비교할 수 없는 파일.subdirs—common_dirs의 이름을dircmp인스턴스에 매핑하는 딕셔너리. 3.10부터 항목은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)