Python - 資料壓縮
大家好,未來的 Python 魔術師們!今天,我們將深入探討令人著迷的資料壓縮世界。作為你友善的鄰居電腦老師,我很興奮能夠引導你們進行這次學習之旅,即使你從未寫過一行程式碼。別擔心;我們將從最基礎的知識開始,逐步進階。所以,拿起你的虛擬魔杖(鍵盤),讓我們一起創造資料的魔法!
資料壓縮介紹
什麼是資料壓縮?
想像一下,你試圖把所有的衣服放進行李箱去度假。資料壓縮就像把那些衣服折得非常整齊,這樣你就可以在相同空間內放入更多東西。在數位世界中,它是關於在不失去重要資訊的情況下縮小檔案大小。
為什麼資料壓縮很重要?
- 节省儲存空間
- 減少傳輸時間
- 降低頻寬使用
- 提高系統性能
現在我們知道了它的重要性,讓我們捲起袖子,開始實際操作一些 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