zipfile 모듈로 폴더 전체 압축하기
파이썬에서는 표준 라이브러리에 포함된 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'이라는 하나의 압축 파일로 묶여 현재 작업 디렉터리에 저장됩니다.
코드 동작 방식 살펴보기
- ZipFile 객체 생성: 첫 번째 인자는 생성할 zip 파일의 이름이고, 두 번째 인자
'w'는 쓰기(write) 모드를 의미합니다. 세 번째 인자ZIP_DEFLATED는 DEFLATE 알고리즘으로 실제 압축을 수행하도록 지정하는 값입니다. - os.walk() 순회: 지정한 경로 아래의 모든 폴더와 파일을 재귀적으로 탐색합니다.
- ziph.write() 호출:
os.path.join()으로 결합한 파일의 전체 경로를 zip 아카이브에 하나씩 추가합니다. - close() 호출: 압축 작업이 끝나면 반드시
close()를 호출해야 파일 헤더가 기록되고 압축 파일이 정상적으로 완성됩니다.
참고: with 문으로 더 안전하게 작성하기
with 문을 사용하면 close()를 직접 호출하지 않아도 자동으로 리소스가 해제되므로, 실수로 닫지 않는 문제를 예방할 수 있습니다.
import os
import zipfile
with zipfile.ZipFile('Zipped_file.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk('./my_folder'):
for file in files:
zipf.write(os.path.join(root, file))두 방법 모두 결과는 동일하지만, with 문을 활용하는 방식이 파이썬 공식 권장 스타일에 더 부합하며 코드도 간결해집니다.