[파이썬] shutil 사용자 지정 압축 해제 로직 구현하기

파이썬의 shutil 모듈은 파일 및 디렉토리 작업에 유용한 기능을 제공합니다. 이 중에서도 shutil.unpack_archive() 함수는 압축 파일을 편리하게 해제하는 기능을 제공합니다. 그러나 기본적인 압축 파일 형식만을 지원하므로, 특정한 압축 파일 형식을 해제해야 하는 경우에는 추가적인 로직이 필요합니다.

이번 블로그 포스트에서는 shutil.unpack_archive() 함수를 사용하여 사용자 지정 압축 해제 로직을 구현하는 방법을 알아보겠습니다.

압축 해제 로직 구현하기

압축 파일 해제를 위해 shutil.unpack_archive() 함수를 사용할 수 있습니다. 그러나 이 함수는 기본적으로 zip, tar, gztar, bztar, xztar 형식의 압축 파일만을 지원합니다. 따라서 다른 압축 형식을 해제하기 위해서는 추가적인 작업이 필요합니다.

먼저 압축 파일의 형식을 확인하는 함수를 작성해야 합니다. 이 함수는 압축 파일의 확장자를 검사하고 해당하는 압축 형식을 반환합니다.

import os
import shutil

def get_archive_format(filename: str) -> str:
    ext = os.path.splitext(filename)[1].lower()
    if ext == '.zip':
        return 'zip'
    elif ext == '.tar':
        return 'tar'
    elif ext == '.gz' or ext == '.tgz':
        return 'gztar'
    elif ext == '.bz2' or ext == '.tbz2':
        return 'bztar'
    elif ext == '.xz' or ext == '.txz':
        return 'xztar'
    else:
        raise ValueError(f"Unknown archive format: {ext}")

위의 코드에서는 os.path.splitext() 함수를 사용하여 파일의 확장자를 추출하고, 확장자를 소문자로 변환한 후 if-elif 문을 사용하여 압축 형식을 판별합니다. 만약 압축 형식을 알 수 없는 경우에는 ValueError 예외를 발생시킵니다.

다음으로, 사용자 지정 압축 형식의 해제 로직을 작성해야 합니다. 이를 위해 unpack_archive() 함수를 오버라이딩하여 사용자가 원하는 방식으로 압축을 해제하는 로직을 구현합니다.

def custom_unpack_archive(filename: str, extract_dir: str):
    format = get_archive_format(filename)
    if format == 'zip':
        # 사용자 지정 압축 형식에 맞는 해제 로직 작성
        pass
    elif format == 'tar':
        # 사용자 지정 압축 형식에 맞는 해제 로직 작성
        pass
    elif format == 'gztar':
        # 사용자 지정 압축 형식에 맞는 해제 로직 작성
        pass
    elif format == 'bztar':
        # 사용자 지정 압축 형식에 맞는 해제 로직 작성
        pass
    elif format == 'xztar':
        # 사용자 지정 압축 형식에 맞는 해제 로직 작성
        pass

위의 코드에서는 get_archive_format() 함수를 사용하여 압축 파일의 형식을 가져온 후, 각 형식에 따른 사용자 지정 해제 로직을 작성할 수 있습니다. 해당 로직은 사전에 정의된 압축 해제 로직을 사용하거나, 사용자가 직접 작성해야 합니다.

결론

shutil.unpack_archive() 함수를 사용하면 기본적인 압축 파일 형식을 쉽게 해제할 수 있습니다. 그러나 특정한 압축 파일 형식을 해제해야 하는 경우에는 사용자 지정 압축 해제 로직을 구현해야 합니다. 이를 위해 get_archive_format() 함수로 압축 파일 형식을 확인하고, custom_unpack_archive() 함수로 각 형식에 따른 해제 로직을 작성할 수 있습니다.

향후 버전의 shutil 모듈에서는 더 다양한 압축 형식을 지원할 수 있도록 기대할 수 있습니다. 그러나 현재로서는 사용자 지정 압축 해제 로직을 구현해야 하는 경우에는 위와 같은 방법을 사용할 수 있습니다.