zipfile لضغط وفك ضغط ملفات ZIP في Python

اعمال

يمكن استخدام الوحدة النمطية zipfile لمكتبة Python القياسية لضغط الملفات إلى ملفات ZIP وإلغاء ضغط ملفات ZIP. تم تضمينه في المكتبة القياسية ، لذلك لا يلزم تثبيت إضافي.

يتم شرح المحتويات التالية.

  • ضغط ملفات متعددة في ملف مضغوط
  • أضف ملفًا جديدًا إلى ملف ZIP موجود
  • ضغط دليل (مجلد) في ملف مضغوط
  • مضغوط في ملف مضغوط بكلمة مرور
  • تحقق من محتويات ملف ZIP.
  • قم باستخراج (فك حزم) محتويات ملف ZIP بالكامل.
  • حدد محتويات ملف ZIP واستخرجه.

ضغط ملفات متعددة في ملف مضغوط

قم بإنشاء كائن ZipFile واستخدم طريقة write () لإضافة الملفات التي تريد ضغطها.

لإنشاء ملف ZIP جديد ، حدد مسار ملف ZIP الذي سيتم إنشاؤه كأول وسيطة لمنشئ كائن ZipFile ، والوسيطة الثانية على النحو التاليw'

بالإضافة إلى ذلك ، يمكن تحديد طريقة الضغط كوسيطة ثالثة.

  • zipfile.ZIP_STORED:ما عليك سوى دمج ملفات متعددة دون ضغط (افتراضي)
  • zipfile.ZIP_DEFLATED:ضغط ZIP عادي (وحدة zlib مطلوبة)
  • zipfile.ZIP_BZIP2:ضغط BZIP2 (مطلوب وحدة bz2)
  • zipfile.ZIP_LZMA:ضغط LZMA (وحدة LZMA مطلوبة)

BZIP2 و LZMA لهما نسبة ضغط أعلى (يمكن ضغطهما إلى حجم أصغر) ، لكن الوقت المطلوب للضغط يكون أطول.

في طريقة write () ، تتم كتابة الملف الذي يحتوي على اسم الملف الوسيط الأول في ملف ZIP باستخدام الوسيطة الثانية arcname. إذا تم حذف اسم arcname ، فسيتم استخدام اسم الملف كما هو. يمكن أن يحدد اسم arcname أيضًا بنية الدليل.

يجب إغلاق كائن ZipFile بطريقة الإغلاق () ، ولكن إذا استخدمت العبارة with ، فسيتم إغلاقه تلقائيًا عند انتهاء الكتلة.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

من خلال تحديد وسيطة compress_type للطريقة write () ، من الممكن أيضًا تحديد طريقة الضغط لكل ملف.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

أضف ملفًا جديدًا إلى ملف ZIP موجود

لإضافة ملف جديد إلى ملف مضغوط موجود ، اضبط الوسيطة الأولى للمُنشئ على مسار ملف zip الحالي عند إنشاء كائن ZipFile. أيضًا ، قم بتعيين وضع الوسيطة الثانية على النحو التالي.a'

ثم ، كما في المثال أعلاه ، ما عليك سوى إضافة الملف باستخدام طريقة write ().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

ضغط دليل (مجلد) في ملف مضغوط

إذا كنت تريد ضغط مجلد (مجلد) بالكامل في ملف ZIP واحد ، فيمكنك استخدام os.scandir () أو os.listdir () لعمل قائمة بالملفات ، ولكن من الأسهل استخدام make_archive () في الإغلاق وحدة.

انظر المقال التالي.

مضغوط في ملف مضغوط بكلمة مرور

لا تسمح لك وحدة zipfile بإنشاء ملفات ZIP محمية بكلمة مرور. إذا كنت تريد ضغط ملف إلى ملف مضغوط محمي بكلمة مرور ، فاستخدم مكتبة طرف ثالث pyminizip.

لاحظ أنه يمكن إلغاء ضغط ملفات ZIP المحمية بكلمة مرور باستخدام وحدة zipfile (انظر أدناه).

تحقق من محتويات ملف ZIP.

يمكنك التحقق من محتويات ملف ZIP موجود.

قم بإنشاء كائن ZipFile عن طريق تعيين ملف الوسيطة الأول في المُنشئ إلى مسار ملف zip الحالي ووضع الوسيطة الثانية على “r”. يمكن حذف وسيطة الوضع نظرًا لأن القيمة الافتراضية هي “r”.

يمكنك استخدام طريقة namelist () لعنصر ZipFile للحصول على قائمة بالملفات المؤرشفة.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

قم باستخراج (فك حزم) محتويات ملف ZIP بالكامل.

لفك محتويات ملف ZIP ، قم بإنشاء كائن ZipFile باستخدام ملف الوسيطة الأول في المُنشئ كمسار لملف ZIP الحالي ووضع الوسيطة الثانية كـ “r” ، كما في المثال أعلاه. يمكن حذف وسيطة الوضع نظرًا لأنها افتراضية على “r”.

تقوم طريقة extractall () الخاصة بكائن ZipFile باستخراج (فك ضغط) محتويات ملف ZIP بالكامل. تحدد الوسيطة الأولى ، المسار ، مسار الدليل المراد الاستخراج إليه. إذا تم حذفها ، فسيتم استخراج الملفات إلى الدليل الحالي.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

يمكن استخراج ملف مضغوط بكلمة مرور عن طريق تحديد كلمة المرور كمتغير pwd للأسلوب extractall ().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

حدد محتويات ملف ZIP واستخرجه.

إذا كنت تريد فك واستخراج ملفات معينة فقط ، فاستخدم طريقة extract ().

الوسيطة الأولى للطريقة extract () هي اسم الملف المراد استخراجه ، ومسار الوسيطة الثانية هو مسار الدليل المراد الاستخراج إليه. إذا تم حذف وسيطة المسار ، فسيتم استخراج الملف إلى الدليل الحالي. يجب أن يتضمن اسم الملف المراد استخراجه المسار إلى الدليل في ملف ZIP إذا تم تخزينه هناك.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

مثل طريقة extractall () ، تسمح لك طريقة extract () أيضًا بتحديد كلمة مرور كمعامل pwd.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')