خانه / آموزش‌ها / کار با فایل‌های فشرده Gzip در پایتون

کار با فایل‌های فشرده Gzip در پایتون

🐍 HomeOfPython
|
📅 1404/10/17

سطح مقدماتی (Beginner Level)

ماژول gzip در پایتون رابطی ساده برای کار با فایل‌های فشرده‌شده با فرمت GNU zip فراهم می‌کند. فشرده‌سازی داده‌ها برای کاهش حجم فایل‌ها هنگام ذخیره‌سازی یا انتقال شبکه بسیار حیاتی است. در این بخش با نحوه ساختن فایل‌های .gz و خواندن آن‌ها آشنا می‌شویم.

۱. آشنایی با ماژول gzip و نوشتن فایل

ساده‌ترین روش برای کار با gzip، استفاده از تابع gzip.open() است. این تابع بسیار شبیه به تابع داخلی open() پایتون عمل می‌کند، اما داده‌ها را به صورت فشرده می‌نویسد یا می‌خواند.

مثال اول: نوشتن متن ساده در فایل فشرده

در این مثال، یک متن را در فایلی به نام example.txt.gz ذخیره می‌کنیم. توجه کنید که باید از حالت (mode) مناسب استفاده کنیم (wt برای نوشتن متنی).

Python

مثال دوم: نوشتن داده‌های باینری (Binary)

گاهی نیاز دارید داده‌ها را به صورت بایت ذخیره کنید. در این حالت از مُد wb استفاده می‌شود.

python
# Static Code: Writing binary data snippet
import gzip

data = b"This is binary data needed to be compressed."

with gzip.open('binary_data.gz', 'wb') as f:
    f.write(data)

۲. خواندن فایل‌های Gzip

برای خواندن فایل‌های فشرده، کافیست حالت فایل را روی rt (خواندن متنی) یا rb (خواندن باینری) تنظیم کنید. ماژول gzip به طور خودکار عملیات Decompression را انجام می‌دهد.

مثال اول: خواندن فایلی که ساختیم

در اینجا فایلی که در مثال قبلی ساختیم را بازخوانی می‌کنیم. چون اسکریپت‌ها در محیط تعاملی ممکن است ایزوله باشند، ما در یک بلوک کد هم می‌نویسیم و هم می‌خوانیم تا اجرا تضمین شود.

Python

مثال دوم: خواندن خط به خط

اگر فایل بسیار حجیم باشد، خواندن یکباره آن در حافظه کار اشتباهی است. می‌توانیم روی آبجکت فایل حلقه بزنیم.

python
# Static Code: Iterating over lines (Snippet)
import gzip

def read_lines_from_gzip(filename):
    with gzip.open(filename, 'rt', encoding='utf-8') as f:
        for line in f:
            print(line.strip())

۳. فشرده‌سازی فایل موجود (File Copy)

یک سناریوی رایج، برداشتن یک فایل معمولی موجود و تبدیل آن به یک فایل .gz است. این کار با استفاده از shutil به راحتی انجام می‌شود زیرا آبجکت‌های gzip فایل‌-مانند (File-like objects) هستند.

مثال اول: کپی و فشرده‌سازی با shutil

Python

نمودار مقایسه حجم


سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، ماژول gzip قابلیت‌هایی فراتر از خواندن و نوشتن ساده فایل دارد. مدیریت حافظه، تنظیم سطوح فشرده‌سازی و کار با جریان‌های داده (Streams) از مباحث مهم این بخش هستند.

۱. فشرده‌سازی در حافظه (In-Memory Compression)

گاهی اوقات نمی‌خواهید فایلی روی دیسک بسازید؛ بلکه می‌خواهید داده‌ها را در حافظه (RAM) فشرده کرده و مثلاً از طریق شبکه ارسال کنید. برای این کار از ترکیب gzip و io.BytesIO استفاده می‌کنیم.

مثال اول: فشرده‌سازی رشته‌ها در حافظه

Python

مثال دوم: بازگرداندن داده از حافظه (Decompression)

python
# Static Code: Function to decompress bytes directly
import gzip
import io

def decompress_bytes(compressed_data):
    in_buffer = io.BytesIO(compressed_data)
    with gzip.GzipFile(fileobj=in_buffer, mode='rb') as f:
        return f.read().decode('utf-8')

۲. تنظیم سطح فشرده‌سازی (Compression Level)

پارامتر compresslevel عددی بین ۱ تا ۹ است.

  • ۱: سریع‌ترین سرعت، کمترین فشرده‌سازی.
  • ۹: کندترین سرعت، بیشترین فشرده‌سازی.
  • ۰: بدون فشرده‌سازی.

انتخاب سطح مناسب توازنی (Trade-off) بین مصرف CPU و حجم خروجی است.

مثال تکنیکی: مقایسه سطوح مختلف

Python

۳. کلاس GzipFile و کنترل دقیق هدرها

تابع gzip.open در واقع یک wrapper برای کلاس GzipFile است. اگر نیاز به کنترل متادیتای فایل Gzip دارید (مانند نام فایل اصلی درون هدر یا زمان اصلاح)، باید مستقیماً از کلاس استفاده کنید.

مثال: تنظیم نام فایل داخلی و زمان

python
# Static Code: Setting filename and mtime manually
import gzip
import time

def create_archive_with_metadata():
    with open('archive.gz', 'wb') as f_out:
        # filename: نامی که هنگام استخراج فایل نمایش داده می‌شود
        # mtime: زمان اصلاح فایل
        with gzip.GzipFile(fileobj=f_out, mode='wb', filename='secret.txt', mtime=time.time()) as gz:
            gz.write(b"Content inside")

۴. مدیریت خطاهای فایل‌های خراب (Corrupted Files)

در محیط‌های پروداکشن، ممکن است با فایل‌های ناقص روبرو شوید. مدیریت استثنای EOFError یا OSError (بسته به نسخه پایتون) ضروری است.

مثال: الگوی امن خواندن فایل

Python

نکات نهایی و Performance

  1. Chunking: هنگام کار با فایل‌های چند گیگابایتی، هرگز از .read() خالی استفاده نکنید. همیشه سایز بافر (مثلاً read(1024*1024)) را مشخص کنید.
  2. Threading: ماژول gzip در پایتون (CPython) هنگام فشرده‌سازی قفل GIL را رها نمی‌کند. برای کارهای سنگین CPU-bound بهتر است از multiprocessing استفاده کنید یا ابزارهای خط فرمان (subprocess.call(['gzip', ...])) را فراخوانی کنید که معمولاً سریع‌تر هستند.

معماری پردازش موازی فشرده‌سازی