728x90
데이터 압축이 필요한 이유?
데이터 전송 시 대용량 데이터는 전송 속도가 느리며, 전송 문제가 발생할 가능성이 높다.
- 데이터 압축의 종류
- 무손실 압축 : 데이터 손실이 전혀 없는 압축
- 손실 압축 : 사람이 눈치채지 못할 수준의 정보만 버리고 압축하는 방법. 대신 무손실 압축보다 압축률을 높일 수 있다.
- 압축률 : 원시 자료량 (원래 데이터 크기) / 압축된 자료량 (압축된 데이터 크기)
- 다양한 압축 알고리즘에 따라 압축 성능 및 시간이 좌우된다.
- 압축 : 인코딩 (Encoding)
- 압축 해제 : 디코딩 (Decoding)
런 - 길이 부호화 (Run-Length Encoding)
대표적인 무손실 압축 방법이다.
AAAABBBBBCCCCCCCCDEEEE라는 문자열을
4(번의) A5(번의) B8(번의) C1(번의) D4(번의) E로 압축하는 방법이다.
zlib
zlib 은 zlib은 데이터를 압축하거나 해제할 때 사용하는 모듈이다. compress()와 decompress() 함수로 문자열을 압축하거나 해제할 수 있다. 데이터 크기를 줄여서 전송이 필요할 경우 사용한다.
문자열 데이터 압축
import zlib
# 대용량 문자열 데이터 (350,000 byte)
data = "Life is too short, You need python." * 10000
print(data)
print(len(data))
350000
zlib 압축
# 유니코드로 인코딩 후 압축
compress_data = zlib.compress(data.encode(encoding='utf-8'))
print(len(compress_data))
1077
print(compress_data)
# 압축률(반올림)
print(f'zlib : {round(len(data) / len(compress_data), 2)}')
zlib : 324.98
여기서 324는 압축된 데이터의 크기가 원래 데이터 크기보다 약 325배 작다는 뜻이다.
zlib 압축 해제
org_data = zlib.decompress(compress_data).decode('utf-8')
print(len(org_data))
350000
print(org_data)
gzip
gzip 압축
gzip 은 파일을 압축하거나 해제할 때 사용하는 모듈이다. 내부적으로 zlib 알고리즘을 사용한다.
import gzip
# 대용량 문자열 데이터 (350,000 byte)
data = "Life is too short, You need python." * 10000
# 원본 데이터 저장
with open('org_data.txt', 'w') as f:
f.write(data)
gzip 압축 해제
with gzip.open('compressed.txt.gz', 'rb') as f:
org_data = f.read().decode('utf-8')
gzip은 내부적으로 zlib을 사용하기 때문에 위에서 나온 1077 바이트와 유사한 값인 1KB가 나온 걸 확인할 수 있다.
zipfile
zipfile은 다양한 확장자로 압축할 수 있다. 그리고 zipfile은 zlib을 사용하지는 않는다. zipfile 은 여러 개 파일을 zip 확장자로 합쳐서 압축할 때 사용하는 모듈이다.
import zipfile
# 파일 합치기
with zipfile.ZipFile('./sample/new_file.zip', 'w') as myzip:
myzip.write('./sample/file1.txt')
myzip.write('./sample/file2.txt')
myzip.write('./sample/file3.txt')
# 압축 해제하기
with zipfile.ZipFile('./sample/new_file.zip') as myzip:
myzip.extractall()
tarfile
tarfile 은 여러개 파일을 tar 확장자로 합쳐서 압축할 때 사용하는 모듈이다.
import tarfile
# 파일 합치기
with tarfile.open('./sample/new_file.tar', 'w') as mytar:
mytar.add('./sample/file1.txt')
mytar.add('./sample/file2.txt')
mytar.add('./sample/file3.txt')
# 압축 해제하기
with tarfile.open('./sample/new_file.tar') as mytar:
mytar.extractall()
'프로그래밍 언어 > Python' 카테고리의 다른 글
[numpy] 자동 형 변환, 기본 연산 (0) | 2024.08.04 |
---|---|
[numpy] arange, linspace (0) | 2024.08.04 |
파일 찾기, 복사, 이동 - glob, fnmatch, shutil (0) | 2024.08.04 |
파일 읽기, 저장 - Pickle 모듈 (0) | 2024.08.04 |
클로저와 데코레이터 (0) | 2024.08.04 |