[파이썬] shutil 압축과 압축 해제 중 사용자 정의 동작 정의하기

파이썬의 shutil 라이브러리는 파일 및 디렉토리 작업을 위한 많은 유틸리티 함수를 제공합니다. 이 중에서도 압축과 압축 해제 기능은 자주 사용되는 기능 중 하나입니다. shutil 모듈을 사용하면 간단하게 파일이나 디렉토리를 압축하거나 압축 해제할 수 있습니다.

하지만 때로는 기본 동작만으로는 부족할 수 있습니다. 사용자 정의 동작을 정의하고 싶을 때가 있을 것입니다. 이번 글에서는 shutil을 사용하여 압축과 압축 해제를 진행하는 중간에 사용자 정의 동작을 추가하는 방법에 대해 알아보겠습니다.

1. 압축하기 전 사용자 정의 동작 추가하기

shutil.make_archive 함수를 사용하여 파일이나 디렉토리를 압축할 수 있습니다. 이 함수를 사용하는 도중에 사용자 정의 동작을 추가하려면 archive_util 모듈의 Archiver 클래스를 상속하여 새로운 클래스를 만들어야 합니다. 그리고 사용자 정의 동작을 위한 메소드를 정의한 다음 해당 메소드를 오버라이딩하면 됩니다.

import shutil
from shutil import make_archive, archive_util

class CustomArchiver(archive_util.Archiver):
    
    def update(self, base_name, root_dir, base_dir, verbose=False, dry_run=False, **kwargs):
        # 여기에 사용자 정의 동작을 추가합니다.
        # base_name: 압축 파일 이름
        # root_dir: 압축 대상 디렉토리
        # base_dir: 압축 대상 디렉토리 내의 서브 디렉토리
        # verbose: 상세 모드 여부
        # dry_run: 압축 없이 시뮬레이션 모드 여부
        # kwargs: 사용자 지정 매개변수
        
        # 사용자 정의 동작을 수행하는 코드 작성
        print("압축하기 전에 사용자 정의 동작을 수행합니다.")
        # ...
        
        # 이후에는 기본 동작을 계속합니다.
        super().update(base_name, root_dir, base_dir, verbose, dry_run, **kwargs)

# 압축하기 위한 기본 동작을 키우기 위해 새로운 클래스를 사용합니다.
shutil.register_archive_format('custom', CustomArchiver)

위 예제에서는 CustomArchiver 클래스를 정의한 후, update 메소드를 오버라이딩하여 사용자 정의 동작을 추가하였습니다. 이 메소드는 압축 과정에서 호출되며, 여기에 사용자가 원하는 작업을 추가할 수 있습니다. 이후 register_archive_format 함수를 사용하여 새로 정의한 압축 포맷을 등록합니다.

2. 압축 해제 후 사용자 정의 동작 추가하기

shutil.unpack_archive 함수를 사용하여 압축 해제를 할 수 있습니다. 마찬가지로 압축 해제 후에 사용자 정의 동작을 추가하려면 archive_util 모듈의 UnArchiver 클래스를 상속하여 새로운 클래스를 만들어야 합니다.

import shutil
from shutil import unpack_archive, archive_util

class CustomUnArchiver(archive_util.UnArchiver):
    
    def update(self, filename, extract_dir, verbose=False, dry_run=False):
        # 여기에 사용자 정의 동작을 추가합니다.
        # filename: 압축 파일 이름
        # extract_dir: 압축 해제될 디렉토리
        # verbose: 상세 모드 여부
        # dry_run: 압축 해제 없이 시뮬레이션 모드 여부
        
        # 사용자 정의 동작을 수행하는 코드 작성
        print("압축 해제 후에 사용자 정의 동작을 수행합니다.")
        # ...
        
        # 이후에는 기본 동작을 계속합니다.
        super().update(filename, extract_dir, verbose, dry_run)

# 압축 해제하기 위한 기본 동작을 키우기 위해 새로운 클래스를 사용합니다.
shutil.register_unpack_format('custom', ['.ext'], CustomUnArchiver)

위 예제에서는 CustomUnArchiver 클래스를 정의한 후, update 메소드를 오버라이딩하여 사용자 정의 동작을 추가하였습니다. 이 메소드는 압축 해제 과정에서 호출되며, 여기에 사용자가 원하는 작업을 추가할 수 있습니다. 이후 register_unpack_format 함수를 사용하여 새로 정의한 압축 해제 포맷을 등록합니다.

마무리

파이썬의 shutil 라이브러리를 사용하여 압축과 압축 해제 작업을 수행하는 동안 사용자 정의 동작을 추가하는 방법을 살펴보았습니다. ArchiverUnArchiver 클래스를 상속하고 새로운 클래스를 만들어 사용자 정의 동작을 구현할 수 있습니다. 이를 통해 기본 동작을 확장하고 원하는 작업을 수행할 수 있습니다.

더 자세한 내용은 파이썬 공식 문서를 참조하시기 바랍니다.