파이썬에서 디렉토리를 ZIP 아카이브로 압축하려면 표준 라이브러리의 zipfile 모듈을 사용하면 됩니다. 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 알고리즘으로 압축하여 파일 크기를 줄입니다. 압축 없이 저장하려면ZIP_STORED를 사용할 수 있습니다.os.path.join(root, file): 운영체제에 맞게 경로 구분자를 자동으로 처리해 줍니다.
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)with 문을 사용하면 코드 블록이 끝나는 시점에 ZIP 파일이 자동으로 닫히므로, 리소스 누수나 손상된 아카이브 문제를 예방할 수 있습니다.