تقنية

فك ضغط بايثون: خروج البيانات لا يعني بلوغ النهاية

البيانات تسبق نهاية التدفق
الكائن نفسه يتابع القراءة. [1] [2]

افحص نهاية التدفق مع المخرج. [1] [2]

الخلاصة السريعة

خروج البيانات لا يثبت بلوغ نهاية التدفق المضغوط؛ افحص d.eof. [1] [2]

  • نضغط ABBA بالإعدادات الافتراضية؛ نسمي الناتج c. [1] [2]
  • قراءة c[:-1] تعيد b'ABBA'، لكن d.eof=False. [1] [2]
  • تمرير c[-1:] للكائن نفسه يعيد b''؛ تصبح d.eof=True. [1] [2]
  • zlib.decompress(c[:-1]) يرفع zlib.error في مثالنا. [1] [2]
  • جربنا بايثون 3.12.14 مع zlib 1.3.2؛ تدفق zlib واحد، دون حد للمخرج أو استدعاء flush. [1] [2]

المثال

import zlib
c=zlib.compress(b"ABBA")
d=zlib.decompressobj()
print(d.decompress(c[:-1]),d.eof)
print(d.decompress(c[-1:]),d.eof)

[1] [2]

الناتج: b'ABBA' False ثم b'' True. [1] [2]

التفسير

eof يبين بلوغ نهاية البيانات المضغوطة. بايتات ABBA خرجت قبل وصول آخر بايت من c؛ طول المخرج وحده لا يكفي. [1] [2]

المقارنة

الدالة المباشرة zlib.decompress(c[:-1]) ترفض التدفق المبتور. الكائن يسمح بتمرير الأجزاء؛ احتفظ بالمخرج السابق عند متابعة القراءة. [1] [2]

المباشر يرفض؛ الكائن ينتظر البقية
المدخل c[:-1]. [1] [2]

النطاق

في المثال المعلن، آخر بايت يكمل التدفق دون بيانات إضافية. لا نعمم المخرج نفسه على كل موضع قطع؛ صيغ أخرى خارج النطاق. [1] [2]

المراجع

  1. Python: zlib
  2. CPython 3.12.14: اختبارات zlib
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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