title: مدیریت فایلهای ZIP در پایتون slug: python-zipfile description: راهنمای جامع کار با ماژول zipfile برای فشردهسازی، استخراج و مدیریت آرشیوها. date: 1404/10/24 order: 97
سطح مقدماتی (Beginner Level)
فرمت ZIP یکی از رایجترین روشها برای فشردهسازی و آرشیو کردن فایلها است. پایتون به صورت پیشفرض ماژولی قدرتمند به نام zipfile دارد که به ما اجازه میدهد بدون نیاز به نصب هیچ ابزار اضافی، فایلهای ZIP بسازیم یا آنها را باز کنیم.
۱. خواندن محتویات فایل ZIP
برای کار با یک فایل فشرده، ابتدا باید آن را باز کنیم. کلاس ZipFile این کار را برای ما انجام میدهد. مهمترین نکته در این مرحله، استفاده از مُد r (Read) است.
متدهای کلیدی در این بخش:
namelist(): لیست نام فایلهای موجود در آرشیو را برمیگرداند.printdir(): ساختار فایلها را به همراه اطلاعاتی مثل تاریخ و حجم در خروجی چاپ میکند.
# Static: Basic syntax for reading a zip file
import zipfile
# Open the zip file in read mode
archive = zipfile.ZipFile('example.zip', 'r')
print(archive.namelist())
archive.close()
۲. استخراج فایلها (Extraction)
دو روش اصلی برای خارج کردن فایلها از حالت فشرده وجود دارد:
extract(member, path): یک فایل خاص را استخراج میکند.extractall(path): تمام فایلهای موجود در آرشیو را در مسیر داده شده استخراج میکند.
در مثال زیر، ما یک اسکریپت کامل میسازیم که ابتدا یک فایل ZIP نمونه ایجاد میکند (تا کد قابل اجرا باشد) و سپس آن را استخراج میکند.
سطح پیشرفته (Professional Level)
در سطح حرفهای، مدیریت حافظه، الگوریتمهای فشردهسازی و امنیت فایلها اهمیت پیدا میکنند. استفاده از Context Manager (with) در اینجا الزامی است تا از بسته شدن صحیح فایلها و جلوگیری از خرابی آرشیو اطمینان حاصل شود.
۱. فشردهسازی با الگوریتمهای مختلف
به صورت پیشفرض، zipfile ممکن است فقط فایلها را "آرشیو" (Store) کند و حجم آنها را کاهش ندهد. برای کاهش حجم واقعی، باید از پارامتر compression استفاده کنیم.
رایجترین متد، zipfile.ZIP_DEFLATED است.
# Static: Import compression constants
import zipfile
# Common compression methods:
# zipfile.ZIP_STORED (No compression - Default)
# zipfile.ZIP_DEFLATED (Standard gzip compression)
# zipfile.ZIP_LZMA (High compression, slower)
۲. نوشتن فایلهای ZIP (حرفهای)
هنگام ساختن آرشیو، گاهی نمیخواهیم فایل را از روی دیسک بخوانیم، بلکه میخواهیم دادههای موجود در حافظه (String یا Bytes) را مستقیم زیپ کنیم. متد writestr برای این کار عالی است.
نکته مهم دیگر، مدیریت ساختار پوشهها داخل فایل ZIP است. آرگومان دوم متد write (با نام arcname) تعیین میکند که فایل با چه نامی در آرشیو ذخیره شود.
۳. کار با فایلهای ZIP در حافظه (In-Memory ZIP)
در برنامههای وب (مثل Django یا Flask) یا میکروسرویسها، اغلب نیاز دارید یک فایل ZIP تولید کنید و آن را بدون ذخیره روی دیسک سرور، مستقیماً برای کاربر ارسال کنید. برای این کار از کلاس io.BytesIO استفاده میکنیم.
۴. امنیت و محدودیتها (Zip Bomb)
هنگام کار با فایلهای ZIP آپلود شده توسط کاربر، باید مراقب Zip Bomb باشید. این فایلها حجم بسیار کمی دارند اما هنگام استخراج به گیگابایتها داده تبدیل میشوند و میتوانند سرور را از کار بیندازند.
همیشه قبل از استخراج، متادیتای فایل (file_size) را بررسی کنید.
# Static: Security check snippet
def safe_extract(zip_ref):
THRESHOLD_SIZE = 100 * 1024 * 1024 # 100 MB Limit
for info in zip_ref.infolist():
if info.file_size > THRESHOLD_SIZE:
raise Exception(f"File {info.filename} is too large! Possible Zip Bomb.")
zip_ref.extractall("safe_dir")