본문 바로가기
프로그래밍/Python

파이썬(Python) 파일 압축 및 압축 풀기 (feat. zlib, gzip, zipfile, tarfile)

by 부자 꽁냥이 2023. 5. 6.

파이썬(Python)에서는 데이터 또는 파일을 압축하기 위한 다양한 내장 모듈을 제공하고 있다. 대표적으로 zlib, gzip, zipfile 그리고 tarfile이 있다. 이번 포스팅에서는 각 모듈을 이용한 압축 및 압축 풀기 방법을 알아보려고 한다.

 

- 목차 -

1. zlib

2. gzip

3. zipfile

4. tarfile


   1. zlib

zlib은 문자열을 압축하거나 압축을 푸는 데 사용되는 모듈로써 이를 이용하면 사이즈가 큰 데이터의 용량을 줄여서 빠르게 전송할 수 있게 해 준다.

 

zlib은 compress를 이용하여 압축, decompress를 이용하여 압축을 해제할 수 있다. 압축할 문자열은 인코딩이 되어 있어야 하며 압축 해제 결과는 인코딩 된 문자열이므로 디코딩을 해줘야 원래의 문자열을 얻을 수 있다.

 

compress에서는 level 인자를 통하여 압축 정도를 지정할 수 있는데 0~9까지 지정할 수 있고 숫자가 높아질수록 압축을 많이 한다(그 대신 시간이 더 걸린다).

 

아래 코드는 원 문자열을 인코딩하여 압축한 뒤 기존 사이즈와 압축된 데이터 사이즈 그리고 압축률을 출력한 것이다.

 

import zlib

string = 'Life is too short, but you have no money!'*10000
encoded_string = string.encode(encoding='utf-8') ## 압축하기전 데이터는 인코딩되어 있어야한다.
print('데이터 크기 :', len(encoded_string))

compressed_string = zlib.compress(encoded_string, level=6) ## 문자열 압축
print('압축된 데이터 크기 :', len(compressed_string))
print('압축률 :', round(len(encoded_string)/len(compressed_string)))

 

원 데이터크기는 410000 바이트이고 압축했을 때 1254 바이트까지 줄어들었으며 압축률은 327이다 ㄷㄷ;;

 

이제 압축을 풀어보면 원래 데이터로 돌아온 것을 확인할 수 있다.

 

original_string = zlib.decompress(compressed_string).decode('utf=8')
print('데이터 크기 :', len(original_string))

 

 


   2. gzip

gzip은 하나의 파일을 압축하고 해제할 수 있는 모듈이다. 이때 압축 확장자는 gz가 된다. 

 

앞에서 다룬 문자열을 텍스트로 저장해 보자.

 

string = 'Life is too short, but you have no money!'*10000

## 텍스트로 저장
with open('./zip_example/string.txt', 'w') as f:
    f.write(string)

 

 

위 코드를 실행하면 string.txt 파일이 생성되었다. 이를 압축해 보자. 압축은 gzip.open을 이용하며 압축 파일 경로와 바이너리 쓰기 모드인 'wb'을 두 번째 인자로 지정한다. 그리고 압축할 문자열을 인코딩해서 write에 넘겨주면 된다.

 

import gzip

with gzip.open('./zip_example/compressed_string.gz', 'wb') as f:
    f.write(string.encode('utf-8')) ## 인코딩해서 write에 넘겨야한다.

 

위 코드를 실행하면 아래와 같이 gz 압축 파일이 생성된다.

 

 

압축 해제는 gzip.open에서 바이너리 읽기 모드인 'rb'로 설정하여 읽어준다. 이때 읽은 파일은 바이트 형식이므로 디코딩을 해줘야 원래의 문자열을 얻을 수 있다.

 

with gzip.open('./zip_example/compressed_string.gz', 'rb') as f:
    original_string = f.read().decode('utf-8') ## 파일을 읽은 뒤 디코딩해준다.
    
print('데이터 크기 :', len(original_string))

 

 


   3. zipfile

zipfile은 여러 파일들을 zip 파일로 압축할 때 또는 zip 파일을 압축 풀 때 사용하는 모듈이다. 먼저 아래와 같이 3개의 텍스트 파일을 압축해 보겠다.

 

 

압축 방법은 쉽다. ZipFile을 쓰기 모드 'w'로 열어서 압축하고자 하는 파일을 원하는 만큼 write에 넣어주면 된다.

 

import os
import zipfile

target_folder = './zip_example/'
with zipfile.ZipFile(os.path.join(target_folder, 'compress.zip'), 'w') as f:
    f.write(os.path.join(target_folder, '메모장1.txt'))
    f.write(os.path.join(target_folder, '메모장2.txt'))
    f.write(os.path.join(target_folder, '메모장3.txt'))

 

코드를 실행하면 아래와 같이 zip 파일이 잘 생성된 것을 알 수 있다.

 

이제 메모장 1~3을 지우고 압축 해제를 해보겠다.

 

압축 해제는 반대로 ZipFile을 읽기 모드 'r'로 열어서 extractall을 이용하면 된다.

 

with zipfile.ZipFile(os.path.join(target_folder, 'compress.zip'), 'r') as f:
    f.extractall()

 


   4. tarfile

tarfile은 여러 파일들을 tar 형식의 파일로 압축하거나 해제하는 모듈이다. 사용법은 zipfile과 거의 동일하다. 파일을 쓰거나 읽을 때 open을 쓴다는 점과 압축할 파일을 add를 이용하여 추가한다는 점이 다르다.

 

import os
import tarfile

target_folder = './zip_example/'
with tarfile.open(os.path.join(target_folder, 'compress.tar'), 'w') as f:
    f.add(os.path.join(target_folder, '메모장1.txt'))
    f.add(os.path.join(target_folder, '메모장2.txt'))
    f.add(os.path.join(target_folder, '메모장3.txt'))

 

 

압축 해제는 zipfile과 마찬가지로 extractall을 이용한다.

 

with tarfile.open(os.path.join(target_folder, 'compress.tar'), 'r') as f:
    f.extractall()

댓글


맨 위로