اگر برنامهای میسازید که با فایلها سروکار دارد، برای صرفهجویی در فضا از zip استفاده کنید.
Zipping روشی زیبا برای فشرده سازی چندین فایل و ترکیب آنها در یک فایل واحد است. این امر نه تنها در فضای ذخیره سازی بلکه باعث صرفه جویی در پهنای باند هنگام انتقال فایل از طریق شبکه می شود. یکی از بهترین ویژگی های zip این است که روی تمام پلتفرم های اصلی کار می کند: ویندوز، لینوکس و مک.
Zip از فشردهسازی بدون اتلاف استفاده میکند تا هنگام فشردهسازی و غیرفشرده کردن، تمام دادهها را حفظ کند. همچنین می توانید فایل های فشرده خود را رمزگذاری و رمزگشایی کنید.
با ویژگیهای بسیار زیادی برای کاوش، کشف کنید که چگونه میتوانید فایلها را با استفاده از ماژول zipfile پایتون بخوانید، فشرده و از حالت فشرده خارج کنید.
ماژول zipfile چیست؟
شما می توانید از ماژول استاندارد zipfile برای دستکاری فایل های فشرده با استفاده از پایتون استفاده کنید. با استفاده از این ماژول می توانید فایل های فشرده را باز کرده و بخوانید، ابرداده های آنها را بخوانید، یک فایل فشرده بسازید، آن را فشرده کنید و فایل ها را از حالت فشرده خارج کنید. سه روش فشرده سازی موجود است: Deflate، Bzip2 و LZMA.
یکی از مواردی که ماژول فاقد آن است، توانایی مدیریت فایل های چند دیسکی است، اما پسوند ZIP64 را مدیریت می کند. همچنین می تواند آرشیوهای فشرده را رمزگشایی کند اما آنها را رمزگذاری نمی کند. با استفاده از ماژول zipfile می توانید ابرداده فایل فشرده مانند تاریخ و زمان اصلاح را دریافت کنید. شما همچنین می توانید جزئیاتی مانند سیستم عامل مورد استفاده برای ایجاد فایل، نسخه zip و اندازه فایل را در هر دو فرمت فشرده و غیر فشرده واکشی کنید.
نحوه زیپ کردن فایل ها با استفاده از پایتون
با استفاده از ماژول zipfile پایتون می توانید چندین فایل را در یک آرشیو زیپ کنید. برای انجام عملیات zip مورد نیاز، ماژول ZipFile را از بسته zipfile وارد کنید. همچنین ماژول OS را برای انتخاب و ذخیره فایل ها وارد کنید.
یک تابع get_all_file_paths () تعریف کنید. باید یک پارامتر دایرکتوری را بپذیرد که حاوی مسیر پوشه حاوی فایلها برای فشردهسازی باشد.
یک لیست خالی را راه اندازی کنید که لیست مسیرهای فایل را ذخیره می کند. برای دریافت محتویات کامل دایرکتوری مورد نظر با استفاده از تابع os.walk از یک حلقه for استفاده کنید. این تابع با حرکت در امتداد آن در یک رویکرد از بالا به پایین یا از پایین به بالا، نام فایل ها را در درخت دایرکتوری واکشی می کند. برای هر دایرکتوری، تابع یک سه تایی حاوی root، dirs و فایل ها را برمی گرداند.
ریشه رشته ای است که شامل مسیر کامل دایرکتوری است. لیست dirs شامل تمام زیر شاخه های موجود در فهرست است. لیست فایل ها شامل تمام فایل های موجود در فهرست است.
در داخل حلقه، یک حلقه دیگر را برای تکرار در لیست فایل ها اعلام کنید. از تابع os.path.join() برای ترکیب نام دایرکتوری با هر نام فایل برای ایجاد یک مسیر کامل استفاده کنید. سپس، این نام فایل کامل را به لیستی که قبلا ایجاد کردید اضافه کنید. پس از اتمام این عملیات، لیست مسیرهای فایل را برگردانید.
# import the required modules
from zipfile import ZipFile
import os
# create a function to get all the file paths
def get_all_file_paths(directory):
# initializing empty list to store file paths
file_paths = []
# navigate through the files
for root, directories, files in os.walk(directory):
for filename in files:
# join the root and filename to create a complete file path
filepath = os.path.join(root, filename)
file_paths.append(filepath)
# returning all file paths
return file_paths
مسیر پوشه ای که حاوی فایل هایی است که می خواهید زیپ کنید را در متغیری به نام دایرکتوری ذخیره کنید. تابع get_all_file_paths() را که قبلا ایجاد کردید فراخوانی کنید و مقداری را که برمی گرداند در file_paths ذخیره کنید.
پیامی را به کاربر نمایش دهید تا بداند این فایلهایی هستند که برنامه فشرده میکند. روی فایل ها تکرار کنید و نام آنها را نمایش دهید.
نامی را که میخواهید فایل فشرده شما داشته باشد را به همراه مشخصاتی که برنامه با استفاده از دستور with برای رسیدگی به استثناها، یک فایل قابل نوشتن برمیگرداند، ارسال کنید. روی هر فایل تکرار کنید و از تابع write() روی فایل قابل نوشتن به یک فایل فشرده استفاده کنید.
هنگامی که عملیات کامل شد، یک پیام خروجی ارسال کنید که توضیح می دهد برنامه همه فایل ها را با موفقیت فشرده کرده است.
# path to folder you want to zip
directory = './pythonzip'
# calling function to get all file paths in the directory
file_paths = get_all_file_paths(directory)
# printing the list of all files you want to zip
print('List of files that will be zipped:')
for file_name in file_paths:
print(file_name)
# writing files to a zipfile
with ZipFile('my_file.zip', 'w') as zip:
# write each file one by one
for file in file_paths:
zip.write(file)
print('All files are zipped!')
نحوه از حالت فشرده خارج کردن فایل ها با استفاده از پایتون
پیاده سازی فایل های فشرده با استفاده از ماژول zipfile بسیار ساده تر است. بسته zipfile را از ماژول ZipFile وارد کنید و نام فایل فشرده ای را که می خواهید استخراج کنید در یک متغیر ذخیره کنید. از عبارت with برای رسیدگی به استثناها استفاده کنید و فایلی را که می خواهید استخراج کنید در حالت خواندن باز کنید. از تابع printdir() برای نمایش فهرست محتویات فایل های موجود در zip استفاده کنید.
پیام پیشرفت را نشان دهید که فایل ها را استخراج می کنید و از تابع ()extractall برای استخراج محتویات فایل فشرده به دایرکتوری فعلی استفاده کنید. همچنین، میتوانید یک پارامتر مسیر برای تغییر مسیری که برنامه فایلها را استخراج میکند، اضافه کنید.
پس از اتمام عملیات، پیامی را با استفاده از عبارت چاپ نمایش دهید.
# importing the required modules
from zipfile import ZipFile
# pass the name of the zip file you want to extract
file_name = "extract.zip"
# opening the zip file in read mode
with ZipFile(file_name, 'r') as zip:
# display the contents of the zip file
zip.printdir()
# extracting all the files
print('Extract in progress...')
zip.extractall()
print('All files are extracted!')
اطلاعات بیشتر درباره فایل های فشرده
فایل های فشرده محبوبیت زیادی به دست آورده اند و دهه هاست که در حال استفاده هستند. وبسایتهای معروفی مانند GitHub و Google Drive به شما امکان میدهند مجموعهای از فایلها را بهصورت یک آرشیو فشرده دانلود کنید. برنامه zip مجموعه ای از فایل ها را در یک بسته فشرده فشرده می کند. این برخلاف ابزاری مانند tar است که فایل ها را با هم بسته بندی می کند اما آنها را فشرده نمی کند.
اگر می خواهید فایل های خود را با استفاده از یک الگوریتم کارآمدتر رمزگذاری کنید، فایل های RAR راه حلی هستند. RAR از الگوریتم AES-128 استفاده می کند که بهتر از الگوریتم deflate مورد استفاده در فایل های فشرده است. در نهایت، یکی را انتخاب کنید که بهترین نیاز شما را برآورده کند.