كيفية التعامل مع ملفات .zip بلغة البايثون:

الكاتب: سُلَيْمان القسيمي.

الإخوة الكرام, سلام الله عليكم.


دون مقدمات, ولا إطالة في الكلمات, سأحدثكم باقتضاب عن إحدى المكتبات المدمجة مع لغة البايثون والتي تتيح لك التعامل مع ملفات .zip عبر كود البايثون الخاص بك من حيث إنشاء, استخراج, وإضافة الملفات المضغوطة بصيغة .zip


في البداية, ومن أجل الاستفادة من وظائف المكتبة, ستحتاج إلى استيراد كلاس يدعى ZipFile من مكتبة zipfile

ولست في حاجة حقيقة إلى استيراد المكتبة كاملة.

سنكتب سطرنا المتعارف عليه لاستيراد شيء ما من مكتبة


from zipfile import ZipFile


طيب, بعد ذلك سننشئ كائنًا من الكلاس ZipFile, ولكن قبل ذلك دعونا نطلع على المعاملات التي يحتاجها الكلاس ZipFile ليعطينا نسخة منه.


عند إنشاء كائن من أي كلاس ستعرف متغير سيكون هو الاسم الذي ستستخدمه دائمًأ للإشارة إلى الكائن, ثم تضع علامة المساواة وتتبعها باسم الكلاس

بعد اسم الكلاس ستقوم بفتح قوسين هلاليَين مطابقين للأقواس التي تُستخدم في الدوال.

داخل القوسَين سنمرر بعض الإعدادات التي يحتاجها الكلاس لإنشاء كائن منه يتم الفصل بين كل معامل وآخر بعلامة الفاصلة ,

إن كلاسنا هذا يطلب معاملَين رئيسيَين اثنَين.

الأول هو اسم الملف ومساره الكامل, وهو عبارة عن string أي أنه يكتب بين علامتَي تنصيص.

المعامل الثاني هو أيضًأ string ويمثل وضعية فتح الملف المضغوط

يحتمل هذا المعامل ثلاث قيم أساسية:

"r": ويشير إلى وضعية القراءة, وهنا أنت بوسعك معرفة محتويات الملف المضغوط بالإضافة إلى استخراج الملفات منه, لكنك لا تستطيع التعديل على تلك الملفات أو إضافة ملفات أخرى.

"w": تشير هذه القائمة إلى وضعية الكتابة, وهنا أنت لا تستطيع مشاهدة المحتوى, بل إنك ستتمكن فقط من إضافة المحتوى إلى الملف.

ملاحظة:

عندما نفتح الملف باستخدام القيمة w كوضعية للفتح فإنه عند إضافة ملف جديد إلى الملف المضغوط فإنه يحذف جميع المحتويات التي فيه ويستبدلها بالملف الجديد.

"a": وضعية الإضافة, وهو مطابق تمامًأ لوضعية الكتابة, لكنك هنا عندما تضيف ملف جديد إلى الملف المضغوط فإنه يبقي الملفات السابقة ويضيف الملف الجديد إليها.

مثال على إنشاء كائن للكلاس ZipFile:

archive = ZipFile("new.zip","a")


في المثال السابق قمنا بفتح ملف في نفس مجلد سكريبت البايثون, وكانت عملية الفتح بوضعية الإضافة.

وهنا سيقوم البرنامج بالبحث عن ملف باسم new.zip , فإن تم إيجاد الملف فسيقوم بفتحه, أما إن لم يكن هناك ملف بهذا الاسم فسيتم إنشاء ملف جديد وفتحه بوضعية الإضافة.


طيب دعونا نضيف بعض الملفات إلى ذلكم الملف المضغوط.

ما سنستخدمه لفعل ذلك هو الوظيفة write حيث نحدد في معاملها الأول مسار الملف الذي نريد إضافته إلى الأرشيف.

archive.write("test1.txt")

جميل.

سيقوم البرنامج هنا بإضافة الملف المدعو ب test1.txt إلى الأرشيف.


دعونا نضيف ملفًأ آخر.


archive.write("test2.txt")


ستتم إضافة الملف test2.txt إلى جانب الملف السابق.

دعونا الآن نغلق الملف هذا ونفتحه مرة أخرى بوضعية القراءة.

archive.close()

إذًا, استخدمنا الوظيفة cclose من الكائن archive لإغلاق الملف.


سنفتحه الآن بنفس الطريقة مع تغيير قيمة المعامل الثاني إلى "r"


archive = ZipFile("new.zip","r")


جميل, ما رأيكم أن نشاهد محتويات الملف المضغوط

لفعل ذلك؛ سنستخدم الوظيفة namelist من الكائن لتقوم بإرجاع مصفوفة تحتوي على أسماء الملفات الموجودة داخل الملف المضغوط.

content = archive.namelist()

السطر السابق سينفذ وظيفة namelist ويحفظ ناتجها في المتغير content.


هيا الآن لنطبع المصفوفة:

print(content)

الناتج:

['test1.txt', 'test2.txt']


حسنٌ وجميل.

ألا ترون أن نجرب استخراج الملف المدعو ب test2.txt من الأرشيف؟


لاستخراج ملف واحد فقط من الأرشيف سنستخدم الوظيفة extract وهي تأخذ معاملَين اثنَين:

الأول إجباري وهو اسم الملف الذي تريد استخراجه.

أما الثاني فهو اختياري وتقوم فيه بكتابة المسار الذي تريد استخراج الملف فيه.

ملحوظة: لو احتوى المسار على أسماء مجلدات غير موجودة فسيقوم تلقائيًا بإنشائها.

تأملوا معي السطر التالي:

archive.extract("test2.txt", "c:\\output")

قلت للبرنامج أن يستخرج لي الملف test2.txt من الأرشيف ويضعه في مجلد output داخل القرص c

الآن لو كان المجلد output هذا غير موجود فسيتم إنشاؤه.

وبطبيعة الحال لو لم نضع قيمة للمعامل الثاني فسيتم استخراج الملف في نفس مكان وجود الأرشيف.


أما لو أردنا استخراج الملفات كاملةً فسنستخدم الوظيفة extractall وفي المعامل الأول نحدد مسار الاستخراج, أو إن شئنا تركه فارغًأ ليتم الاستخراج في نفس المجلد.


وفقكم الله.

تعليقات