Python - 데이터 압축

안녕하세요, 미래의 Python 마법사들! 오늘은 우리는 데이터 압축의 흥미로운 세계로 몸을 던져보겠습니다. 여러분의 친절한 이웃 컴퓨터 교사로서, 여러분이 이전에 한 줄의 코드조차 써본 적이 없다고 해도 여러분을 이 여정을 안내하는 것을 기대하며 기뻐합니다. 걱정 마세요; 우리는 매우 기본적인 부분에서 시작하여 점점 더 나아갈 것입니다. 그래서, 가상의 지팡이(키보드)를 잡고 데이터 마법이 일어나는 것을 볼까요!

Python - Data Compression

데이터 압축 소개

데이터 압축이란?

여행을 위해 수하물 사이즈에 모든 옷을 맞추려는 것을 상상해보세요. 데이터 압축은 그 옷들을 정말 깔끔하게 접어서 같은 공간에 더 많은 것을 넣을 수 있게 하는 것과 같습니다. 디지털 세계에서는 중요한 정보를 잃지 않고 파일을 더 작게 만드는 것입니다.

데이터 압축의 중요성은 무엇인가요?

  1. 저장 공간을 절약합니다
  2. 전송 시간을 줄입니다
  3. 대역폭 사용량을 낮추습니다
  4. 시스템 성능을 향상시킵니다

이제 그 중요성을 알았으니, 손을 쓰고 실제 Python 코드에 진입해보겠습니다!

기본적인 문자열 압축

문자열을 압축하는 간단한 예제로 시작해보겠습니다. 우리는 런-길이 인코딩이라는 기술을 사용하겠습니다.

def compress_string(s):
compressed = ""
count = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
count += 1
else:
compressed += s[i-1] + str(count)
count = 1
compressed += s[-1] + str(count)
return compressed

# Let's try it out
original = "aaabbbccccddeeee"
compressed = compress_string(original)
print(f"Original: {original}")
print(f"Compressed: {compressed}")

이 코드를 실행하면 다음과 같이 보입니다:

Original: aaabbbccccddeeee
Compressed: a3b3c4d2e4

이 여기서 무슨 일이 일어나고 있는 건가요? 연속된 문자를 세고 그 문자 뒤에 수를 추가하여 대체하고 있습니다. 멋지지 않나요?

zlib을 사용한 파일 압축

이제 레벨을 올려서 zlib 모듈을 사용하여 실제 파일을 압축해보겠습니다. 모듈이 무엇인지 모를 걱정 마세요 – 우리가 사용할 수 있는 사전 작성된 코드의 도구箱으로 생각하면 됩니다.

import zlib

def compress_file(input_file, output_file):
with open(input_file, 'rb') as file_in:
data = file_in.read()

compressed_data = zlib.compress(data, level=9)

with open(output_file, 'wb') as file_out:
file_out.write(compressed_data)

print(f"Original size: {len(data)} bytes")
print(f"Compressed size: {len(compressed_data)} bytes")
print(f"Compression ratio: {len(compressed_data) / len(data):.2%}")

# Let's compress a file
compress_file('example.txt', 'example.txt.gz')

이 스크립트는 파일을 읽고, 그 내용물을 압축한 다음, 압축된 데이터를 새 파일에 저장합니다. 압축 수준(9)은 가장 높은 것이므로 최대 압축을 의미합니다.

데이터를 되찾는 역압축

물론, 압축된 데이터를 역압축할 수 없다면 많은 사용이 없습니다. 이를 위해 함수를 작성해보겠습니다:

def decompress_file(input_file, output_file):
with open(input_file, 'rb') as file_in:
compressed_data = file_in.read()

decompressed_data = zlib.decompress(compressed_data)

with open(output_file, 'wb') as file_out:
file_out.write(decompressed_data)

print(f"Decompressed size: {len(decompressed_data)} bytes")

# Let's decompress our file
decompress_file('example.txt.gz', 'example_decompressed.txt')

이 함수는 우리의 압축 함수와 정반대의 일을 합니다. 압축된 파일을 읽고, 데이터를 역압축한 다음, 새 파일에 씁니다.

압축 방법 비교

이제 몇 가지 압축 기술을 살펴보았으니, 이들을 비교해보겠습니다. 차이를 쉽게 볼 수 있도록 표를 사용하겠습니다:

방법 장점 단점 최적 사용 목적
런-길이 인코딩 구현이 간단합니다 반복된 문자에만 효과적입니다 비트맵 이미지, 간단한 패턴
zlib 높은 압축 비율, 널리 지원됩니다 더 간단한 방법보다 느립니다 일반 목적 압축, 네트워크 프로토콜

고급 주제: 이미지 압축

모험심을 가진 여러분들을 위해, Pillow 라이브러리를 사용한 이미지 압축에 빠르게 봐보겠습니다. 이것이 복잡하게 보이더라도 걱정 마세요 – 가능한 것에 대한 취향을 느끼기 위한 것일 뿐입니다!

from PIL import Image

def compress_image(input_file, output_file, quality):
with Image.open(input_file) as img:
img.save(output_file, optimize=True, quality=quality)

# Let's compress an image
compress_image('example.jpg', 'compressed_example.jpg', 50)

이 스크립트는 이미지를 열고, 품질을 감소시키어 압축한 다음, 새 파일로 저장합니다. quality 매개변수는 1(최악)에서 95(최상)까지 범위를 가집니다.

결론

축하합니다! 여러분은 Python을 사용하여 데이터 압축의 첫 걸음을 내딛었습니다. 우리는 기본 문자열 압축, 파일 압축 및 역압축, 심지어 이미지 압축까지 다루었습니다. 압축은 모든 것은 효율적으로 표현할 수 있는 패턴을 찾는 것이라는 것을 기억하십시오.

여러분이 Python 여정을 계속할 때, 더 강력한 압축 기술을 발견하게 될 것입니다. 누谁知道? 아마도 여러분이 데이터 압축의 다음 장기적인 발견을 할지도 모릅니다! 그 때까지는 코드를 계속 쓰고, 호기심을 유지하고, 여정 속에서 즐겨가세요.

Credits: Image by storyset