filecmp — 파일 및 디렉터리 비교

filecmp — 파일 및 디렉터리 비교

filecmp 모듈은 다양한 선택적인 시간/정확성 트레이드오프로 파일과 디렉터리를 비교하는 함수를 정의해요. 파일 비교에 대해서는 difflib 모듈도 참고하세요.

출처: Python 표준 라이브러리

본문

filecmp 모듈은 다음 함수들을 정의해요.

filecmp.cmp(f1, f2, shallow=True)

f1f2라는 이름의 파일을 비교해서 같아 보이면 True, 아니면 False를 돌려줘요.

shallow가 참이고 두 파일의 os.stat() 시그니처(파일 타입, 크기, 수정 시각)가 동일하면 두 파일은 같다고 간주해요.

그렇지 않으면 크기나 내용이 다르면 서로 다르다고 처리해요.

이 함수는 외부 프로그램을 호출하지 않아서 이식성과 효율성이 좋다는 점을 기억해 두세요.

이 함수는 과거 비교와 결과를 캐시하는데, 파일의 os.stat() 정보가 바뀌면 캐시 항목이 무효화돼요. 전체 캐시는 clear_cache()로 지울 수 있어요.

filecmp.cmpfiles(a, b, common, shallow=True)

두 디렉터리 ab에서 common에 주어진 이름의 파일들을 비교해요.

파일 이름 세 개의 리스트(match, mismatch, errors)를 돌려줘요. match는 일치하는 파일 목록, mismatch는 일치하지 않는 파일 이름, errors는 비교할 수 없었던 파일 이름 목록이에요. 파일이 한 디렉터리에 없거나, 읽을 권한이 없거나, 다른 이유로 비교가 불가능하면 errors에 나열돼요.

shallow 매개변수는 filecmp.cmp()와 같은 의미와 기본값을 가져요.

예를 들어 cmpfiles('a', 'b', ['c', 'd/e'])a/cb/c, a/d/eb/d/e를 비교해요. 'c''d/e' 각각은 반환된 세 리스트 중 하나에 들어가요.

filecmp.clear_cache()

filecmp 캐시를 지워요. 파일이 수정된 직후 너무 빨리 비교돼서 기본 파일시스템의 mtime 해상도 안에 들어올 때 유용할 수 있어요.

버전 3.4에 추가됨.

dircmp 클래스

class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)

디렉터리 ab를 비교하는 새 디렉터리 비교 객체를 만든다. ignore는 무시할 이름들의 목록이고, 기본값은 filecmp.DEFAULT_IGNORES예요. hide는 숨길 이름들의 목록이고 기본값은 [os.curdir, os.pardir]이에요.

dircmp 클래스는 기본적으로 filecmp.cmp()에서 설명한 대로 shallow 매개변수를 사용해 얕은 비교로 파일을 비교해요.

버전 3.13에서 변경: shallow 매개변수 추가.

dircmp 클래스는 다음 메서드들을 제공해요.

  • report() — (sys.stdout으로) ab의 비교 결과를 출력해요.
  • report_partial_closure()ab, 그리고 공통의 직접 하위 디렉터리에 대한 비교 결과를 출력해요.
  • report_full_closure()ab, 그리고 (재귀적으로) 공통 하위 디렉터리에 대한 비교 결과를 출력해요.

dircmp 클래스는 비교되는 디렉터리 트리에 대한 여러 정보 bit를 얻는 데 쓸 수 있는 흥미로운 속성들을 제공해요. __getattr__() 훅을 통해 모든 속성이 지연 계산되므로, 가벼운 속성만 사용한다면 속도 손실이 없어요.

  • left — 디렉터리 a.
  • right — 디렉터리 b.
  • left_listhideignore로 필터링한 a의 파일·하위 디렉터리.
  • right_listhideignore로 필터링한 b의 파일·하위 디렉터리.
  • commonab 양쪽에 있는 파일·하위 디렉터리.
  • left_onlya에만 있는 파일·하위 디렉터리.
  • right_onlyb에만 있는 파일·하위 디렉터리.
  • common_dirsab 양쪽에 있는 하위 디렉터리.
  • common_filesab 양쪽에 있는 파일.
  • common_funnyab 양쪽에 있지만 디렉터리 간에 타입이 다르거나 os.stat()이 오류를 보고하는 이름.
  • same_files — 클래스의 파일 비교 연산자를 사용해 양쪽에서 동일한 파일.
  • diff_filesab 양쪽에 있지만 내용이 다른 것으로 판정된 파일.
  • funny_filesab 양쪽에 있지만 비교할 수 없었던 파일.
  • subdirscommon_dirs의 이름을 dircmp 인스턴스(dircmp의 하위 클래스인 MyDirCmp 타입이라면 MyDirCmp 인스턴스)로 매핑하는 딕셔너리.

버전 3.10에서 변경: 이전에는 항목이 항상 dircmp 인스턴스였어요. 이제 selfdircmp의 하위 클래스라면 항목이 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)