مدتی قبل مطلب "دانلود ترجمه مانگای حمله به تایتان" رو اینجا منتشر کردم، برای آپلود قسمت‌های این مانگا حدود ۱۰۰ دایرکتوری تصویر داشتم که باید زیپ‌شون می‌کردم. برا این که براحتی این ۱۰۰ دایرکتوری رو زیپ کنم یک اسکریپت با پایتون نوشتم. در ادامه مطلب توضیح مختصری در مورد فشرده‌سازی با پایتون می‌دم و سپس اسکریپتم رو میارم. 

فشرده سازی فایل با پایتون:

عمل فشرده‌سازی در پایتون به صورت پیشفرض با ماژول zipfile انجام می‌شود پس در قدم اول ماژول zipfile رو وارد کرده و سپس شی zipfile را می‌سازیم و به‌صورت زیر عمل می‌کنیم:

import zipfile

test_zip = zipfile.ZipFile('test.zip', 'w')
test_zip.write('filename', compress_type=zipfile.ZIP_DEFLATED)

test_zip.close()

در متد write اولین پارامتر مربوط به اسم فایلی (و یا پچی) هست که می‌خواهیم فشرده‌اش کنیم. پارامتر دوم موربوط به متد فشرده‌سازی هست، در پایتون ۲ فقط دو نوع متد فشرده‌سازی داریم که عبارتند از: ZIP_STORED و ZIP_DEFLATED اما بعد از پایتون ۳/۳ متدهای ZIP_BZIP2 و ZIP_LZMA نیز در دسترس هست. 

فشرده‌سازی دایرکتوری در پایتون:

برای این کار بعد از ایجاد شی zipfile عمل write را برای تک تک فایل‌های موجود در دایرکتوری تکرار می‌کنیم:

import os
import zipfile

test_zip = zipfile.ZipFile("test_dir.zip", "w")
for dirpath, dirnames, filenames in os.walk("fa"):
test_zip.write(dirpath) #for empty folder
for filename in filenames:
test_zip.write(os.path.join(dirpath, filename))
test_zip.close()

متد walk از ماژول os اسامی تمامی فایل‌ها و دایرکتوری‌ها و ساب‌دایرکتوی‌های موجود در یک مسیر را به صورت یک tuple سه تایی تولید می‌کند. 

فشرده‌سازی دایرکتوری‌های موجود در یک مسیر به صورت مجزا:

همانطور که در بالا گفتم، من حدود ۱۰۰ دایرکتوری داشتم که شامل فایل‌های تصاویر مانگا بود که می‌خواستم به ساده‌ترین نحو و به صورت مجزا زیپ‌شون کنم. برای این کار با استفاده از متد listdir، لیست فایل‌ها و دایرکتوری‌های روت رو در آوردم سپس برا هر دایرکتوری عمل بالا رو تکرار کردم.

import os
import zipfile

for fName in os.listdir("."):
if os.path.isdir(fName):
for dirpath, dirnames, filenames in os.walk(fName):
test_zip= zipfile.ZipFile(fName+".zip", "w")
for filename in filenames:
test_zip.write(os.path.join(dirpath, filename))
test_zip.close()