Python의 표준 라이브러리에는 filecmp 모듈이 포함되어 있으며, 이 모듈은 파일과 디렉토리를 비교할 수 있는 다양한 함수를 제공합니다. 비교 작업은 단순히 파일 내부의 데이터뿐만 아니라 파일의 메타데이터(속성 정보)까지 함께 고려한다는 점이 특징입니다.
이 글에서는 다음과 같은 파일 및 디렉토리 구조를 예제로 사용하여 filecmp 모듈의 주요 기능을 살펴보겠습니다.
먼저 현재 작업 디렉토리 아래에 dir1과 dir2라는 두 개의 디렉토리를 생성하고, 각각 다음과 같은 파일을 준비합니다.
--dir1/newfile.txt-- This is a file in dir1 --dir1/file1.txt-- Hello Python --dir1/file2.txt-- Python Standard Library --dir2/file1.txt-- Hello Python --dir2/file2.txt-- Python Library
이제 filecmp 모듈에서 제공하는 다양한 비교 함수들을 하나씩 자세히 알아보겠습니다.
filecmp.cmp(f1, f2, shallow=True)
이 함수는 두 개의 파일을 비교하여 내용이 완전히 동일하면 True, 그렇지 않으면 False를 반환합니다. shallow 매개변수는 기본값이 True이며, 이 경우 파일의 메타데이터까지 함께 고려하여 비교가 수행됩니다. 반면 shallow=False로 설정하면 파일의 실제 내용만을 기준으로 비교합니다.
앞서 정의한 파일 구조를 기준으로 아래 코드는 다음과 같은 결과를 출력합니다.
Differing files : ['file2.txt']
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt')
True
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt', shallow = False)
True
>>> filecmp.cmp('dir1/file2.txt', 'dir2/file2.txt')
Falsefilecmp.cmpfiles(dir1, dir2, common)
이 함수는 두 디렉토리에 있는 파일들을 한 번에 비교하고, 세 개의 항목을 가진 튜플을 반환합니다. 첫 번째 항목은 일치하는(matched) 파일 목록, 두 번째 항목은 일치하지 않는(unmatched) 파일 목록, 세 번째 항목은 비교 중 오류가 발생한 파일 목록입니다.
>>> match, mismatch, errors = filecmp.cmpfiles('dir1','dir2',['file1.txt', 'file2.txt'])
>>> match
['file1.txt']
>>> mismatch
['file2.txt']
>>> errors
[]filecmp 모듈에는 dircmp 클래스도 정의되어 있습니다. 이 클래스의 객체는 디렉토리 비교 객체로, 두 디렉토리(왼쪽 디렉토리와 오른쪽 디렉토리)에 있는 파일들을 비교합니다. 생성된 객체는 아래에서 설명할 여러 메서드와 속성을 활용할 수 있습니다.
filecmp.dircmp(a, b)
dircmp 클래스의 생성자입니다. 매개변수 a와 b에는 서로 비교할 두 디렉토리를 지정합니다. 기본적으로 시스템 파일(숨김 파일)은 비교 대상에서 제외됩니다.
>>> result = filecmp.dircmp('dir1', 'dir2')dircmp 클래스에서 제공하는 주요 메서드와 속성은 다음과 같습니다.
report()
두 디렉토리 간의 비교 결과를 콘솔에 출력하는 메서드입니다.
>>> result = filecmp.dircmp('dir1', 'dir2')
>>> result.report()
diff dir1 dir2
Only in dir1 : ['newfile.txt']
Identical files : ['file1.txt']
Differing files : ['file2.txt']left, right
생성자에 전달된 첫 번째 디렉토리와 두 번째 디렉토리의 이름을 반환하는 속성입니다.
>>> result.left 'dir1' >>> result.right 'dir2'
left_list, right_list
왼쪽 디렉토리와 오른쪽 디렉토리에 포함된 파일 목록을 각각 반환하는 속성입니다.
>>> result.left_list ['file1.txt', 'file2.txt', 'newfile.txt'] >>> result.right_list ['file1.txt', 'file2.txt']
common, common_files, common_dirs
common은 양쪽 디렉토리에 공통으로 존재하는 파일과 디렉토리 전체를, common_files는 공통 파일만을, common_dirs는 공통 하위 디렉토리만을 반환합니다.
>>> result.common ['file1.txt', 'file2.txt'] >>> result.common_files ['file1.txt', 'file2.txt'] >>> result.common_dirs []
same_files, diff_files
dircmp 클래스에 정의된 비교 연산을 기준으로, 내용이 동일한 파일 목록은 same_files가, 서로 다른 파일 목록은 diff_files가 반환합니다.
>>> result.same_files ['file1.txt'] >>> result.diff_files ['file2.txt']
지금까지 filecmp 모듈의 파일 비교 함수인 cmp()와 cmpfiles(), 그리고 디렉토리 비교를 담당하는 dircmp 클래스의 다양한 메서드와 속성에 대해 살펴보았습니다. 이 기능들을 활용하면 별도의 외부 도구 없이 Python 코드만으로 파일과 디렉토리의 차이를 손쉽게 확인할 수 있습니다.