Advertisement
  1. Code
  2. Python

فشرده سازی و استخراج فایل ها در پایتون

Scroll to top
Read Time: 6 min

() translation by (you can also view the original English article)

اگر چند وقتی است که با کامپیوتر ها کار می کنید، شاید با فرمت فایل zip. برخورد کرده باشید.  آنها فایل های خاصی هستند که می توانند محتوای فشرده بسیاری فایلها، پوشه ها، و زیر پوشه های دیگر را در خود نگاه دارند. این ویژگی آنها را برای فرستادن فایل به اینترنت بسیار مفید می کند.  آیا می دانستید که می توانید از پایتون برای فشرده سازی و استخراج فایها استفاده کنید؟ 

این آموزش به شما چگونگی استفاده از ماژول zipfile در پایتون را برای فشرده سازی و استخراج فایل های تکی یا چندتایی را نشان می دهد.

فشرده سازی فایلهای تکی

این یکی آسان است و به کد بسیار کمی نیاز دارد. با وارد کردن ماژول zipfile شروع کرده و سپس شیء ZipFile را در حالت نوشتن با معین کردن دومین پارامتر به شکل "w" باز می کنیم.  اولین پارامتر مسیر خود فایل می باشد. در اینجا کدی است که نیاز دارید:

1
import zipfile
2
      
3
jungle_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\jungle.zip', 'w')
4
jungle_zip.write('C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED)
5
6
jungle_zip.close()

لطفا دقت فرمایید که من در تمام تکه کدها مسیر را به شکل ویندوز می نویسم؛ اگر شما از لینوکس یا مک استفاده می کنید باید تغییرات لازم را بدهید.

می توانید متدهای مختلفی را برای فشرده سازی فایلها معین کنید. روش های جدید تر BZIP2 و LZMA در پایتون 3.3 اضافه شدند، و ابزارهای دیگری که این دو روش فشرده سازی را پشتیبانی نمیکنند نیز، موجود می باشند.  به این دلیل، بهتر است تا فقط از روش DEFLATED استفاده کنیم.  همچنان باید از این روش ها برای دیدن تفاوت بین حجم فایلهای فشرده شده استفاده کنید. 

فشرده سازی چندین فایل

این کمی پیچیده است زیرا باید همه فایل ها را تکرار کنید.  کد زیر باید تمام فایلهایی که فرمت آنها pdf. می باشد را در یک پوشه فشرده کند.

1
import os
2
import zipfile
3
4
fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip', 'w')
5
6
for folder, subfolders, files in os.walk('C:\\Stories\\Fantasy'):
7
8
    for file in files:
9
        if file.endswith('.pdf'):
10
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), 'C:\\Stories\\Fantasy'), compress_type = zipfile.ZIP_DEFLATED)
11
12
fantasy_zip.close()

این بار، ما ماژول os را وارد کرده و از متد ()walk آن برای تکرار همه فایلها و زیرپوشه های داخل پوشه اصلی استفاده کرده ایم.  من تنها فایل های pdf را در این مسیر فشرده می کنم.  همچنین می توانید فایلهای مختلف آرشیو شده را برای هر فرمت با استفاده از جملات if بسازید. 

اگر نمی خواهید ساختار مسیر را نگاه دارید، می توانید تمام فایلها را با خط زیر در یک جا جمع کنید:

1
fantasy_zip.write(os.path.join(folder, file), file, compress_type = zipfile.ZIP_DEFLATED)

متد ()write سه پارامتر را قبول می کند.  اولین پارامتر نام فایلی است که می خواهیم آن را فشرده کنیم.  دومین پارامتر اختیاری است و به شما اجازه می دهد تا نام دیگری برای فایل فشرده شده معین کنید.  اگر چیزی معین نکنید، از نام اصلی استفاده می شود.

استخراج همه فایل ها

می توانید برای استخراج همه فایل ها و پوشه ها از یک فایل زیپ به مسیر فعلی از ()extractall استفاده کنید. همچنین می توانید برای استخراج همه فایل ها و پوشه ها در یک مسیر خاص، نام یک پوشه را به ()extracall رد کنید. اگر پوشه ای را که رد کرده اید وجود نداشته باشد، این متد آن را برای شما می سازد. اینجا کدی است که می توانید از آن برای استخراج فایل ها استفاده کنید:

1
import zipfile
2
    	
3
fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip')
4
fantasy_zip.extractall('C:\\Library\\Stories\\Fantasy')
5
6
fantasy_zip.close()

اگر می خواهید چندین فایل را استخراج کنید، باید نام فایل هایی که می خواهید استخراج کنید را به صورت یک لیست وارد کنید.

استخراج فایل های تکی

این نیز مشابه استخراج چندین فایل می باشد.  یک تفاوت در این است که این بار باید نام فایل و مسیری را که بعدها در آن فایل ها استخراج می شوند را اول بدهید. همچنین، به جای ()extractall باید از متد ()extract استفاده کنید. در اینجا قطعه کدی برای استخراج فایل های تکی می باشد.

1
import zipfile
2
    	
3
fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip')
4
fantasy_zip.extract('Fantasy Jungle.pdf', 'C:\\Stories\\Fantasy')
5
6
fantasy_zip.close()

خواندن فایل های زیپ

موقعیتی را در نظر بگیرید که باید ببینید که آیا یک آرشیو زیپ حاوی فایلی خاصی می باشد. تا اینجا، تنها گزینه شما برای این کار استخراج همه فایل های داخل آرشیو است. همچنین، شاید بخواهید تنها فایل هایی را که از یک حجم معینی بزرگ تر هستند را استخراج کنید. ماژول zipfile به شما اجازه می دهد بدون نیاز به استخراج آرشیو، از محتوای آن مطلع شوید.

استفاده از متد ()namelist شیء ZipFile، لیستی از نام همه عضوهای آرشیو بر می گرداند. برای گرفتن اطلاعات درباره یک فایل خاص در آرشیو، می توانید از متد ()getinfo شیء ZipFile استفاده کنید. این دسترسی به اطلاعات مخصوص به آن فایل، مانند حجم فشرده و غیر فشرده شده فایل یا زمان آخرین تغییرات را به شما می دهد. ما مجدد به آن بازخواهیم گشت.

وقتی که فایل های زیادی باید پردازش شوند، فراخوانی متد ()getinfo بر روی تک تک فایل ها می تواند فرآیندی خسته کننده باشد. در این مورد، می توانید از متد ()infolist برای برگرداندن لیستی حاوی یک شیء ZipInfo برای هر عضو داخل آرشیو، استفاده کنید.  ترتیب این شیء ها در لیست با خود فایل های زیپ یکسان است.

همچنین با استفاده از متد (file(read می توانید محتویات یک فایل خاص را به صورت مستفیم بخوانید، که در اینجا file نام فایلی است که می خواهید آن را بخوانید.  برای انجام این کار، آرشیو باید در حالت خواندن یا فرمان باز باشد.

برای گرفتن حجم فشرده شده یک فایل تکی از آرشیو، می توانید از ویژگی compress_size استفاده کنید. همچنین، برای فهمیدن حجم غیر فشرده، می توانید از ویژگی file_size استفاده کنید.

کد زیر از خصوصیات و متدهای مطرح شده برای استخراج فایل هایی که کمتر از 1 مگابایت حجم دارند استفاده می کند. 

1
import zipfile
2
3
stories_zip = zipfile.ZipFile('C:\\Stories\\Funny\\archive.zip')
4
5
for file in stories_zip.namelist():
6
    if stories_zip.getinfo(file).file_size < 1024*1024:
7
		stories_zip.extract(file, 'C:\\Stories\\Short\\Funny')
8
        
9
stories_zip.close()

برای گرفتن تاریخ و زمان آخرین تغییر یک فایل خاص در آرشیو، می توانید از ویژگی date_time استفاده کنید. این تاپلی حاوی شش ارزش را برمیگرداند. این ارزش ها به ترتیب، سال، ماه، روز آن ماه، ساعت، دقیقه، و ثانیه می باشد. سال همیشه بزرگ تر یا مساوی 1980 می باشد، و ساعت ها، دقیقه ها، و ثانیه ها بر پایه صفر می باشند.

1
import zipfile
2
3
stories_zip = zipfile.ZipFile('C:\\Stories\\Funny\\archive.zip')
4
5
thirsty_crow_info = stories_zip.getinfo('The Thirsty Crow.pdf')
6
7
print(thirsty_crow_info.date_time)
8
print(thirsty_crow_info.compress_size)
9
print(thirsty_crow_info.file_size)
10
        
11
stories_zip.close()

این اطلاعات درباره حجم فایل اصلی و حجم فایل فشرده شده به شما برای تصمیم گیری درباره اینکه فشرده سازی یک فایل ارزش دارد یا خیر، کمک می کند.  من مطمئنم که از این اطلاعات در موقعیت های دیگری نیز می توان استفاده کرد.  

کلام پایانی

همانطور که از این آموزش مشخص شد، استفاده از ماژول zipfile برای فشرده سازی فایل ها به شما انعطاف پذیری زیادی می دهد.  می توانید فایل های مختلف در یک مسیر را در آرشیوهای دیگر بر اساس نوع، نام یا حجم آنها فشرده سازی کنید.  همچنین می توانید تصمیم بگیرید که آیا ساختار مسیر را می خواهید حفظ کنید یا خیر. همچنین، در حال استخراج فایلها، می توانید آنها را در مکانی که می خواهید، بر اساس ملاک های خود مانند حجم و غیره، استخراج کنید. 

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.