Python - 資料壓縮

大家好,未來的 Python 魔術師們!今天,我們將深入探討令人著迷的資料壓縮世界。作為你友善的鄰居電腦老師,我很興奮能夠引導你們進行這次學習之旅,即使你從未寫過一行程式碼。別擔心;我們將從最基礎的知識開始,逐步進階。所以,拿起你的虛擬魔杖(鍵盤),讓我們一起創造資料的魔法!

Python - Data Compression

資料壓縮介紹

什麼是資料壓縮?

想像一下,你試圖把所有的衣服放進行李箱去度假。資料壓縮就像把那些衣服折得非常整齊,這樣你就可以在相同空間內放入更多東西。在數位世界中,它是關於在不失去重要資訊的情況下縮小檔案大小。

為什麼資料壓縮很重要?

  1. 节省儲存空間
  2. 減少傳輸時間
  3. 降低頻寬使用
  4. 提高系統性能

現在我們知道了它的重要性,讓我們捲起袖子,開始實際操作一些 Python 程式碼!

基本字串壓縮

讓我們從壓縮一個字串的簡單例子開始。我們將使用一種稱為 run-length 編碼的技術。

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

# 來試一試
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%}")

# 來壓縮一個檔案
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")

# 來解壓縮我們的檔案
decompress_file('example.txt.gz', 'example_decompressed.txt')

此函數做的是我們壓縮函數的相反操作。它讀取壓縮的檔案,解壓縮資料,並將其寫入新檔案。

比較壓縮方法

現在我們已經看到了一些壓縮技術,讓我們比較它們。我們將使用表格來容易地查看差異:

方法 優點 缺點 最佳使用情境
Run-length 編碼 實現簡單 只對重複字元有效 圖像比特圖,簡單模式
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)

# 來壓縮一張圖像
compress_image('example.jpg', 'compressed_example.jpg', 50)

此腳本打開一張圖像,通過降低其質量來壓縮它,並將其保存為新檔案。quality 參數範圍從 1(最差)到 95(最佳)。

結論

恭喜你!你已經用 Python 開始了你的資料壓縮之旅。我們已經涵蓋了基本的字串壓縮,檔案壓縮和解壓縮,甚至還接觸了圖像壓縮。請記住,壓縮就是關於找到模式並以更有效的方式表示它們。

當你繼續你的 Python 之旅時,你將會發現更強大的壓縮技術。誰知道呢?也許你會發明下一個資料壓縮的突破!在那之前,請繼續編程,保持好奇,並且不要忘了在途中享受樂趣。

Credits: Image by storyset