Python에서는 zipfile 모듈을 사용해 디렉터리 전체를 ZIP 아카이브로 손쉽게 압축할 수 있습니다. os.walk() 함수로 폴더 트리를 순회하면서 하위 폴더의 모든 파일을 재귀적으로 압축 파일에 추가하면 됩니다.
기본 예제
import os
import zipfile
def zipdir(path, ziph):
# ziph는 zipfile 핸들입니다
for root, dirs, files in os.walk(path):
for file in files:
ziph.write(os.path.join(root, file))
zipf = zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED)
zipdir('./my_folder', zipf)
zipf.close()
위 코드를 실행하면 my_folder 내부의 모든 파일과 하위 폴더가 'Zipped_file.zip'이라는 하나의 압축 파일로 묶여 현재 작업 디렉터리에 저장됩니다.
코드 설명
- os.walk(path): 지정한 경로를 루트로 하는 폴더 트리를 위에서 아래로 순회하며, 각 단계마다 (현재 경로, 하위 폴더 목록, 파일 목록)을 반환합니다.
- zipfile.ZIP_DEFLATED: deflate 알고리즘으로 데이터를 실제 압축하여 저장합니다. 이 옵션을 생략하면 압축 없이 저장되므로 파일 크기가 커질 수 있습니다.
- ziph.write(os.path.join(root, file)): 원본 폴더 구조를 그대로 유지한 채 각 파일을 압축 파일에 추가합니다.
더 간단한 방법: shutil 모듈 활용
별도의 순회 코드를 작성하지 않고 싶다면 Python 표준 라이브러리의 shutil.make_archive() 함수를 사용하는 것이 가장 간편합니다.
import shutil
shutil.make_archive('Zipped_file', 'zip', './my_folder')
이 한 줄만으로 폴더 트리 전체가 자동으로 압축됩니다. 간단한 스크립트나 일회성 작업에는 이 방법을, 압축 과정을 세밀하게 제어해야 하는 경우에는 zipfile 모듈을 직접 사용하는 것을 권장합니다.