التابع ZipFile.open()‎‎ في بايثون

من موسوعة حسوب


يتيح التابع الوصول إلى عضو في الأرشيف ككائن ثنائي شبيه بالملفات.

البنية العامة

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

المعاملات

‎name

اسم الملف المراد الوصول إليه ضمن الأرشيف أو كائن ZipInfo.

mode

إن توفّرت قيمة لهذا المعامل فيجب أن تكون 'r' (القيمة الافتراضية) أو 'w'.

عند استخدام الوضع 'r' يكون الكائن الشبيه بالملفات (ZipExtFile) للقراءة فقط ويقدّم التوابع التالية:

read(), readline(), readlines(), seek(), tell(), __iter__(), __next__()‎.

يمكن لهذه الكائنات أن تعمل بمعزل عن ZipFile.

إن أخذ المعامل mode القيمة 'w' فإنّ التابع يعيد مقبض ملف قابل للكتابة والذي يدعم التابع write()‎، وعندما يكون مقبض الملف القابل للكتابة مفتوحًا تؤدي محاولة قراءة ملفات ZIP أخرى أو الكتابة فيها إلى إطلاق الاستثناء ValueError.

إن لم يكن حجم الملف المضاف إلى الأرشيف معلومًا مسبقًا ولكنّه قد يتجاوز ‎2 GiB فيستحسن تمرير القيمة force_zip64=True لضمان قدرة صيغة الترويسة على التعامل مع ملفات كبيرة. أما إن كان حجم الملف معروفًا مسبقًا، فيمكن إنشاء كائن ZipInfo مع تعيين قيمة للمعامل file_size واستخدام هذا الكائن كقيمة للمعامل name.

pwd

كلمة المرور المستخدمة لفك التعمية عن ملفات ZIP المعمّاة.

ملاحظات:

  • يمكن للتوابع open()‎ و read()‎ و extract()‎ أن تتعامل مع أسماء الملفات أو مع كائنات ZipInfo. تظهر فائدة هذا الأمر عند القراءة من ملفات ZIP تحتوي على ملفات ZIP ذات أسماء مكرّرة.
  • لم تعد الدالة البانية تدعم الوضع 'U' في الإصدار 3.6 من اللغة، ويمكن استخدام الكائن io.TextIOWrapper لقراءة الملفات النصية المضغوطة في وضع universial newlines.
  • يمكن استخدام التابع open()‎ لكتابة الملفات إلى ملف الأرشيف باستخدام القيمة 'w' للمعامل mode في الإصدار 3.6 من بايثون.
  • يؤدي استدعاء التابع open()‎ على كائن ZipFile مغلق إلى إطلاق الاستثناء ValueError في الإصدار 3.6 من بايثون. أما في الإصدارات السابقة فكان التابع يُطلق الاستثناء RuntimeError.

أمثلة

يبين المثال التالي آلية عمل التابع:

>>> import zipfile
>>> zip = zipfile.ZipFile('files.zip')
>>> file = zip.open('file1.txt')
>>> file.read()
b'Hsoub Wiki.\n'

يمكن للتابع open()‎ أن يدير السياق ما يعني إمكانية استخدامه مع عبارة with:

>>> with zipfile.ZipFile('files.zip') as myzip:
...     with myzip.open('file1.txt') as myfile:
...         print(myfile.read())
... 
b'Hsoub Wiki.\n'

انظر أيضًا

مصادر

صفحة Work with ZIP archives في توثيق بايثون الرسمي.