Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python filecmp 모듈로 파일과 디렉토리 비교하는 방법

Python의 표준 라이브러리에는 filecmp 모듈이 포함되어 있으며, 이 모듈은 파일과 디렉토리를 비교할 수 있는 다양한 함수를 제공합니다. 비교 작업은 단순히 파일 내부의 데이터뿐만 아니라 파일의 메타데이터(속성 정보)까지 함께 고려한다는 점이 특징입니다.

이 글에서는 다음과 같은 파일 및 디렉토리 구조를 예제로 사용하여 filecmp 모듈의 주요 기능을 살펴보겠습니다.

먼저 현재 작업 디렉토리 아래에 dir1dir2라는 두 개의 디렉토리를 생성하고, 각각 다음과 같은 파일을 준비합니다.

--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')
False

filecmp.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 클래스의 생성자입니다. 매개변수 ab에는 서로 비교할 두 디렉토리를 지정합니다. 기본적으로 시스템 파일(숨김 파일)은 비교 대상에서 제외됩니다.

>>> 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 코드만으로 파일과 디렉토리의 차이를 손쉽게 확인할 수 있습니다.