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

Python shutil 모듈 완벽 가이드: 파일·디렉토리 고급 작업의 모든 것

파일 복사, 이동, 삭제, 압축처럼 반복적으로 수행해야 하는 파일 시스템 작업은 실무 개발에서 매우 자주 등장합니다. 파이썬(Python) 표준 라이브러리의 shutil 모듈은 바로 이런 고급(high-level) 파일 및 디렉토리 연산을 손쉽게 처리할 수 있도록 다양한 함수를 제공합니다.

이 글에서는 shutil 모듈의 대표적인 함수들을 하나씩 살펴보고, 각 함수의 용도와 차이점을 코드 예제와 함께 정리해 드립니다.

1. copy() – 파일 복사하기

copy() 함수는 파일을 동일한 디렉토리 또는 다른 디렉토리의 지정된 위치로 복사합니다. 첫 번째 매개변수는 기존 파일 경로(문자열), 두 번째 인수는 생성될 파일의 이름 또는 디렉토리입니다. 두 번째 인수가 디렉토리라면 해당 디렉토리 안에 같은 이름으로 파일이 복사됩니다. 단, 원본 파일의 메타데이터(생성일, 권한 등)는 유지되지 않는다는 점에 유의하세요.

>>> import shutil
>>> shutil.copy("hello.py", "newdir/")
'newdir/hello.py'

2. copy2() – 메타데이터까지 보존하는 복사

copy2() 함수는 copy()와 거의 동일하게 동작하지만, 소스 파일의 메타데이터까지 그대로 보존한다는 점이 다릅니다. 예를 들어 복사된 파일의 '마지막 수정 날짜' 속성은 원본 파일과 동일하게 유지됩니다. 원본 정보를 그대로 가져와야 하는 백업 작업에 특히 유용합니다.

>>> shutil.copy2('person.py', 'newdir/')
'newdir/person.py'

3. copyfile() – 파일 내용만 복사하기

copyfile() 함수는 두 개의 문자열 인수(원본 파일명, 대상 파일명)를 받아 파일 내용을 복사합니다. 즉, 원본 파일이 같은 디렉토리 안에 지정한 새 이름으로 복사됩니다. 메타데이터나 권한 정보는 복사되지 않으며 순수하게 내용만 복제된다는 점을 기억하세요.

>>> shutil.copyfile('start.py', 'end.py')
'end.py'

4. copyfileobj() – 파일 객체 단위로 복사하기

copyfileobj() 함수는 파일 경로 문자열이 아니라 파일 객체(file object)를 매개변수로 받습니다. 파일 객체는 open() 함수로 얻을 수 있으며, 원본 파일은 읽기 모드('r'), 대상 파일은 쓰기 모드('w')로 열려 있어야 합니다. 대용량 파일을 청크 단위로 처리해야 할 때 활용하면 좋습니다.

>>> f1 = open('hello.py', 'r')
>>> f2 = open('python.py', 'w')
>>> shutil.copyfileobj(f1, f2)

5. move() – 파일·디렉토리 이동하기

move() 함수는 파일과 디렉토리를 한 위치에서 다른 위치로 재귀적으로 이동시킵니다. 이동과 동시에 파일명을 변경하고 싶을 때도 이 함수 하나로 해결할 수 있습니다.

>>> shutil.move('hello.py', 'newdir/')
'newdir/hello.py'

6. copytree() – 디렉토리 전체 복제하기

copytree() 함수는 한 디렉토리의 모든 파일과 하위 디렉토리를 다른 디렉토리로 재귀적으로 복사합니다. 두 매개변수는 반드시 문자열이어야 하며, 대상 디렉토리는 사전에 존재하지 않아야 합니다(함수가 직접 생성합니다). 내부적으로는 개별 파일 복사 시 copy2()를 사용하기 때문에 메타데이터도 함께 보존됩니다.

>>> shutil.copytree('dir1', 'dir2')
'dir2'

7. rmtree() – 디렉토리 전체 삭제하기

rmtree() 함수는 지정된 디렉토리와 그 안의 모든 파일, 하위 디렉토리를 한꺼번에 삭제합니다. 복구가 불가능하므로 호출 전에 경로를 반드시 확인하는 습관이 필요합니다.

>>> shutil.rmtree('dir2')

8. disk_usage() – 디스크 사용량 확인하기

disk_usage() 함수는 지정된 경로의 디스크 사용 통계를 반환합니다. 전체 용량(total), 사용 중인 용량(used), 가용 용량(free) 정보를 namedtuple 형태로 제공합니다.

>>> shutil.disk_usage('c:\\python36\\dir1')
usage(total=245681352704, used=84932993024, free=160748359680)

9. which() – 실행 파일 경로 찾기

which() 함수는 시스템 PATH에서 지정한 실행 파일의 절대 경로를 찾아 반환합니다. 리눅스 셸의 'which' 명령어와 동일한 역할을 하며, 외부 프로그램이 설치되어 있는지 확인할 때 유용합니다.

>>> shutil.which('calc')
'C:\\WINDOWS\\system32\\calc.EXE'

10. make_archive() – 압축 아카이브 만들기

make_archive() 함수는 지정한 루트 디렉토리의 파일들을 하나의 아카이브(zip 또는 tar 계열)로 묶어줍니다. 백업 파일을 자동 생성하는 스크립트를 작성할 때 자주 사용됩니다.

>>> root_dir = 'newdir'
>>> shutil.make_archive("newdirarch", "zip", root_dir)
'C:\\python36\\newdirarch.zip'

11. get_archive_formats() – 지원 포맷 목록 조회

get_archive_formats() 함수는 현재 시스템에서 지원되는 모든 아카이브 형식의 목록을 반환합니다. bztar, gztar, tar, xztar, zip 등의 포맷을 확인할 수 있습니다.

>>> shutil.get_archive_formats()
[('bztar', "bzip2'ed tar-file"), ('gztar', "gzip'ed tar-file"), ('tar', 'uncompressed tar file'), ('xztar', "xz'ed tar-file"), ('zip', 'ZIP file')]

12. unpack_archive() – 아카이브 압축 해제하기

unpack_archive() 함수는 주어진 아카이브 파일의 압축을 해제합니다. 두 번째 매개변수로 추출 대상 디렉토리를 지정할 수 있으며, 생략하면 현재 작업 디렉토리에 압축이 풀립니다.

>>> shutil.unpack_archive('newdirarch.zip', 'newdir')

마무리 정리

shutil 모듈은 os 모듈보다 한 단계 높은 수준의 파일 시스템 작업을 담당합니다. 단순 파일 복사에는 copy(), 메타데이터 보존이 필요하면 copy2(), 폴더 단위 복사에는 copytree(), 백업 압축에는 make_archive()를 사용하는 것이 핵심입니다. 각 함수의 차이를 잘 이해해 두면 파일 관리 자동화 코드를 훨씬 깔끔하게 작성할 수 있습니다.