파이썬 표준 라이브러리에는 zipfile이라는 모듈이 포함되어 있습니다. 이 모듈을 활용하면 ZIP 파일에 대한 다양한 작업을 손쉽게 수행할 수 있습니다.
ZIP 파일은 대표적인 아카이브(압축 보관) 파일 형식입니다. 무손실(lossless) 데이터 압축 기능을 제공하기 때문에, 압축된 상태에서도 원본 데이터를 완벽하게 복원할 수 있습니다. 하나의 ZIP 파일 안에는 여러 개의 압축된 파일을 담을 수 있습니다.
ZIP 파일의 장점은 저장 공간 요구량을 줄여주고, 일반적인 네트워크 환경에서도 전송 속도를 크게 향상시킨다는 점입니다.
파이썬에서 ZIP 파일을 사용하려면 먼저 zipfile 모듈을 임포트해야 합니다.
from zipfile import ZipFile
1. 디렉터리 전체를 ZIP 파일로 만들기
먼저 특정 디렉터리를 통째로 ZIP 파일로 압축하는 방법을 살펴보겠습니다. 예를 들어 메인 디렉터리 안에 파일과 여러 하위 디렉터리가 있다고 가정합니다.
이 경우 os.walk() 함수를 사용해 디렉터리 전체를 순회하면서 모든 파일과 폴더의 경로를 리스트에 저장합니다. 그다음 ZIP 파일을 쓰기(write) 모드로 열고, 저장해 둔 경로의 파일들을 차례대로 압축 파일에 기록하면 됩니다.
예제 코드
# 디렉터리와 하위 디렉터리의 모든 파일을 가져와 zip으로 변환
from zipfile import ZipFile
import os
def get_all_files(directory): # 디렉터리에서 모든 파일 경로를 가져오는 함수
paths = []
for root, dirs, files in os.walk(directory):
for f_name in files:
path = os.path.join(root, f_name) # 전체 경로를 구성하여 추가
paths.append(path)
return paths # 파일 경로 목록 반환
directory = './sample_files'
paths = get_all_files(directory)
# 압축될 파일 이름 출력
print('다음 파일들이 zip 파일에 저장됩니다')
for file in paths:
print(file)
# 쓰기 모드로 zip 파일을 열어 생성
with ZipFile('my_files.zip', 'w') as zf:
for file in paths:
zf.write(file)
print('Zip이 성공적으로 생성되었습니다')
실행 결과
다음 파일들이 zip 파일에 저장됩니다 ./sample_files\TP_python_prev.pdf ./sample_files\text_files\file1.txt ./sample_files\text_files\file2.txt Zip이 성공적으로 생성되었습니다
2. ZIP 파일 압축 해제하기
이번에는 zipfile 모듈로 ZIP 파일의 압축을 해제하는 방법을 알아보겠습니다. 압축을 해제하려면 먼저 ZIP 파일을 읽기(read) 모드로 연 뒤, extract() 또는 extractall() 메서드를 사용해 내용물을 추출합니다.
extract() 메서드는 추출할 파일의 경로를 인자로 받아 해당 파일만 꺼낼 수 있고, extractall()은 ZIP 안의 모든 파일을 한 번에 추출합니다.
예제 코드
# zip 파일 압축 해제
from zipfile import ZipFile
zip_file = 'my_files.zip'
with ZipFile(zip_file, 'r') as zf:
# zip 내부의 파일 목록 표시
zf.printdir()
# zip 파일에서 모든 파일 추출
zf.extractall()
print('Zip 압축 해제 완료')
실행 결과
File Name Modified Size sample_files/TP_python_prev.pdf 2018-10-19 13:19:48 1915882 sample_files/text_files/file1.txt 2018-11-06 13:34:46 22 sample_files/text_files/file2.txt 2018-11-06 13:35:02 24 Zip 압축 해제 완료
3. infolist()로 ZIP 파일 상세 정보 조회하기
마지막으로 zipfile 모듈의 infolist() 메서드를 살펴보겠습니다. 이 메서드는 ZIP 파일에 포함된 각 파일에 대해 파일 이름, 수정 날짜, 파일 크기 등 다양한 메타 정보를 담은 리스트를 반환합니다.
예제 코드
# zip 파일 정보 조회
from zipfile import ZipFile
import datetime
zip_file = 'my_files.zip'
with ZipFile(zip_file, 'r') as zf:
for detail in zf.infolist():
print('파일 이름: ' + detail.filename)
print('\t수정 날짜: ' + str(datetime.datetime(*detail.date_time)))
print('\tZip 버전: ' + str(detail.create_version))
print('\t시스템 버전: ' + str(detail.create_system)) # 0은 Windows
print('\t파일 크기(바이트): ' + str(detail.file_size))
실행 결과
파일 이름: sample_files/TP_python_prev.pdf 수정 날짜: 2018-10-19 13:19:48 Zip 버전: 20 시스템 버전: 0 파일 크기(바이트): 1915882 파일 이름: sample_files/text_files/file1.txt 수정 날짜: 2018-11-06 13:34:46 Zip 버전: 20 시스템 버전: 0 파일 크기(바이트): 22 파일 이름: sample_files/text_files/file2.txt 수정 날짜: 2018-11-06 13:35:02 Zip 버전: 20 시스템 버전: 0 파일 크기(바이트): 24
지금까지 파이썬의 zipfile 모듈을 활용해 디렉터리를 ZIP으로 압축하는 방법, 압축을 해제하는 방법, 그리고 압축 파일의 상세 정보를 확인하는 방법까지 살펴보았습니다. 이 세 가지 기능만 익혀두면 실무에서 파일 백업, 로그 압축, 데이터 패키징 등 다양한 작업을 효율적으로 처리할 수 있습니다.