دورة تطوير بايثون المتقدمة
الفصل
>
المستوى

وحدات التسلسل
وحدات الضغط

الهدف

قم بأخذ الرسائل والأوامر وضغطها للأرشفة والإرسال.

هناك عدة تعليمات إنشاء وشحنات وبيانات شحن تم تقديمها وتحتاج إلى نقلها أو أرشفتها. على الرغم من أنه يمكن إرسالها يدويًا، فإن طريقة جيدة للقيام بذلك هي عن طريق ضغط وفك ضغط الملفات ثم تخزينها أو إرسالها. للقيام بذلك، يمكنك استخدام وحدات الضغط لتقليل حجم الملفات وجعل المعلومات أسهل في الإدارة. على عكس المشاكل الأخرى التي حللناها حيث تعلمنا واستخدمنا وحدة واحدة فقط، هناك عدة وحدات ضغط يمكننا استخدامها مع مجموعة صغيرة من الدوال. وهي كالتالي:

للحصول على سرعة ضغط عالية ومستوى ضغط منخفض، استخدم وحدة zlib عبر إضافة import zlib. لأغراضنا سنستخدم الدالة التالية: zlib.compress()، التي تستخدم وسيطًا واحدًا وهو البيانات التي تريد ضغطها. يجب إدخال الوسيط على شكل بايتات بدلاً من سلسلة نصية.

للحصول على سرعة ضغط متوسطة ومستوى ضغط متوسط، استخدم وحدة bz2 عبر إضافة import bz2. لأغراضنا سنستخدم الدوال التالية:

  • bz2.compress()، تستخدم وسيطًا واحدًا وهو البيانات التي تريد ضغطها.
  • bz2.decompress()، تستخدم وسيطًا واحدًا وهو البيانات التي تريد ضغطها. يجب إدخال الوسيط على شكل بايتات بدلاً من سلسلة نصية.

يجب إدخال الوسائط على شكل بايتات بدلاً من سلسلة نصية.

للحصول على ضغط عالي ولكن بسرعة ضغط بطيئة، استخدم وحدة lzma عبر إضافة import lzma. لأغراضنا سنستخدم الأصناف والدوال التالية:

  • lzma.LZMACompressor(): الصنف المستخدم لإنشاء كائنات ضاغطة تمكنك من تفعيل ضاغط.
  • compress(): تستخدم وسيطًا واحدًا وهو البيانات التي تريد ضغطها. يجب إدخال الوسيط على شكل بايتات بدلاً من سلسلة نصية. يجب إدخال الوسيط على شكل بايتات بدلاً من سلسلة نصية.

بالإضافة إلى هذه الوحدات، سنستخدم الدالة bytes()، التي تمكنك من تحويل السلاسل النصية إلى بايتات مما يكون مفيدًا للضغط. تأخذ وسيطين: السلسلة النصية التي تريد تحويلها والصيغة، والتي لأغراضنا هي 'utf-8'.

هناك ثلاث ثوابت تحتوي على بيانات يجب ضغطها، وهي red_message وblue_message وgreen_message. للبدء، اذهب إلى علامة X الذهبية فوق السجادة الحمراء، وأنشئ متغيرًا باسم red_bytes. خذ الثابت red_message وحوّل الرسالة إلى بايتات حتى يمكن ضغط البيانات، باستخدام الدالة bytes() مع صيغة 'utf-8'، بهذا الشكل: red_bytes = bytes(red_message, 'utf-8').

أنشئ متغيرًا باسم red_compression وخزن فيه قيمة zlib.compress(). استخدم red_bytes كوسيط لضغط البيانات، بهذا الشكل: red_compression = zlib.compress(red_bytes). بعد ضغط البيانات، استخدم الدالة المعرفة مسبقًا display() في محرر الشيفرة وأضف المتغيرين red_message وred_compression كوسيطين لقراءة الرسالة وعرض بيانات الضغط.

اذهب إلى علامة X الفاتحة فوق السجادة الحمراء وواجه المكتب، وأنشئ متغيرين باسم message_length وcompression_length. في هذين المتغيرين سنخزن طول الأحرف للبيانات قبل وبعد الضغط باستخدام الدالة len(). على سبيل المثال، لـ message_length احصل على طول red_message بهذا الشكل: message_length = len(red_message). افعل الشيء نفسه لـ compression_length بتخزين len(red_compression).

بمجرد ملء المتغيرين، استخدم الدالة المعرفة مسبقًا write() وأدخل message_length وcompression_length كوسيطين للتحقق من أحجام الضغط. يوضح هذا مدى ضغط الملف مقارنةً بحالته غير المضغوطة.

اذهب إلى علامة X الداكنة فوق السجادة الزرقاء وواجه الكمبيوتر. أنشئ متغيرًا باسم blue_bytes وحول blue_message إلى بايتات باستخدام الدالة bytes() بنفس الطريقة التي فعلتها مع red_message. خذ الثابت blue_message واضغطه بتخزين نتيجة bz2.compress() وإدخال blue_bytes كوسيط لضغط البيانات، بهذا الشكل: blue_message = bz2.compress(blue_bytes).

أنشئ متغيرًا باسم blue_decompress وخزن فيه نتيجة bz2.decompress() وأضف blue_message كوسيط لعرض البيانات بعد فك الضغط. أضف المتغيرين blue_message وblue _decompress إلى الدالة المعرفة مسبقًا display() لعرض النسخ المضغوطة والمفكوكة للرسالة.

توجه إلى علامة X الداكنة فوق السجادة الخضراء وأنشئ كائنًا باسم compressor وعبّئه بـ lzma.LZMACompressor()، سيؤدي هذا إلى إنشاء كائن ضاغط يمكن استخدامه مع دوال lzma. أنشئ متغيرًا باسم green_bytes وحول green_message إلى صيغة بايتات باستخدام الدالة bytes() بنفس الطريقة التي فعلتها مع red_message وblue message.

أنشئ متغيرًا باسم green_compression وخزن فيه compressor.compress()، مضيفًا green_bytes كوسيط. سيتيح لك ذلك ضغط بيانات الرسالة باستخدام كائن الضاغط. في الدالة المعرفة مسبقًا display() أضف المتغيرين green_message وgreen_compression كوسيطين لعرض الرسالة والبيانات المضغوطة.

اذهب إلى علامة X الفاتحة فوق السجادة الخضراء وواجه المكتب، عدّل المتغيرين المسمّيين message_length وcompression_length. في هذين المتغيرين سنخزن طول الأحرف للبيانات قبل وبعد الضغط باستخدام الدالة len(). بالنسبة لـ message_length احصل على طول green_message باستخدام len(). افعل الشيء نفسه لـ compression_length بتخزين len(green_compression). بمجرد ملء المتغيرين، استخدم الدالة المعرفة مسبقًا write() وأدخل message_length وcompression_length كوسيطين للتحقق من أحجام الضغط وإنهاء المستوى.

كتاب الكود