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()
코드 동작 원리
- zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED): 새 ZIP 파일을 쓰기 모드('w')로 생성합니다.
ZIP_DEFLATED옵션을 지정하면 데이터가 압축되어 파일 크기가 줄어듭니다. - os.walk(path): 지정한 경로를 루트로 하는 모든 하위 디렉터리와 파일을 자동으로 순회합니다.
- ziph.write(os.path.join(root, file)): 각 파일의 전체 경로를 조합해 ZIP 아카이브에 하나씩 추가합니다.
- zipf.close(): 작업이 끝난 후 반드시 파일 핸들을 닫아야 변경 사항이 정상적으로 저장됩니다.
위 코드를 실행하면 my_folder 폴더의 전체 내용이 현재 작업 디렉터리에 Zipped_file.zip이라는 이름으로 압축되어 저장됩니다.
with 문으로 더 안전하게 처리하기
close() 호출을 잊으면 압축 파일이 손상될 수 있으므로, 파일 핸들을 자동으로 닫아주는 with 문을 사용하는 것이 좋습니다.
import os
import zipfile
def zipdir(path, ziph):
for root, dirs, files in os.walk(path):
for file in files:
ziph.write(os.path.join(root, file))
with zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
zipdir('./my_folder', zipf)
이 방식은 코드가 간결해질 뿐만 아니라 예외가 발생하더라도 리소스가 안전하게 해제되므로, 실무에서 권장되는 패턴입니다.