Coding for KidsCoding for Kids
المستويات الإبداعيةالتحدياتدليل المعلم
صوت للميزات
دورة تطوير بايثون المتقدمة
الفصل
>
المستوى

وحدات التسلسل
وحدات مارشال وبيكل

الهدف

اذهب إلى محطة الخدمة وتأكد من تخزين البيانات بشكل صحيح باستخدام وحدة JSON لتنسيق الملفات.

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

لاستخدام وحدتي Marshal و Pickle، قم باستيراد وظائفهما بكتابة: import marshal و import pickle. ولأغراضنا، سنستخدم الوظائف التالية:

  • marshal.dumps(): يقوم بتسلسل البيانات إلى صيغة ثنائية، مصمم للسرعة داخل بايثون. يأخذ وسيطاً واحداً، وهو البيانات التي ترغب في تسلسلها، ويقتصر على الأنواع الأساسية للبيانات.
  • marshal.loads(): يقوم بفك تسلسل البيانات الثنائية إلى أنواع بيانات قابلة للقراءة في بايثون، محدود في قدراته ولكنه سريع التنفيذ. يأخذ وسيطاً واحداً، وهو البيانات المراد فك تسلسلها.
  • pickle.DEFAULT_PROTOCOL: يتحقق من أي نسخة من بروتوكول التسلسل الخاص بـ Pickle هي الافتراضية في إصدار بايثون لديك. تؤثر البروتوكولات على كيفية تسلسل البيانات.
  • pickle.HIGHEST_PROTOCOL: يتحقق من أي نسخة من بروتوكول التسلسل الخاص بـ Pickle هي الأعلى المتاحة في إصدار بايثون لديك. تؤثر البروتوكولات على كيفية تسلسل البيانات.
  • pickle.dumps(): يقوم بتسلسل هياكل بيانات بايثون المعقدة إلى صيغة ثنائية وفقاً للبروتوكول المستخدم. يأخذ وسيطين، البيانات التي ترغب في تسلسلها ونسخة البروتوكول التي ترغب في استخدامها عند التسلسل.
  • pickle.loads(): يقوم بفك تسلسل البيانات الثنائية إلى أنواع بيانات قابلة للقراءة في بايثون، ذو قدرة عالية على معالجة كائنات بايثون. يأخذ وسيطاً واحداً، وهو البيانات التي ترغب في فك تسلسلها.

بالإضافة إلى هذه الوحدات والوظائف، سنستخدم أيضاً وحدة تنسيق تُدعى pprint، والتي سنستوردها باستخدام from pprint import pprint. يتيح لنا ذلك استخدام الوظيفة pprint() والتي يمكن استخدامها لتنسيق هياكل البيانات مثل القواميس مما يسمح لنا بعرض المعلومات بوضوح.

للبداية، اتجه نحو علامة X المضيئة داخل محطة المراقبة الصغيرة وواجه الطرفية الحاسوبية. تقوم المحطة بمراقبة ضغط المياه وظروف التربة للتضاريس القريبة التي يتم تطويرها لزراعة المحاصيل. هناك ثابت يُدعى reading، يحتوي على بيانات بايثون التي جمعتها المحطة.

قم بإنشاء متغير يُدعى data وخزن قيمة وظيفة marshal.dumps() مع تعيين reading كوسيط. كما في المثال: data = marshal.dumps(reading). استخدم متغير data مع الوظيفة المكتوبة مسبقاً display() لعرض بيانات المتغير المسلسلة.

اخرج إلى المحطة وتوجه نحو علامة X الذهبية، استخدم وظيفة open() لفتح الباب والحصول على الوصول إلى المكتب. اتجه إلى علامة X المضيئة أمام الطرفية، وقم بفك تسلسل البيانات التي قمت بتسلسلها للتو. أنشئ متغيراً يُدعى output وخزن قيمة marshal.loads() مع استخدام متغير data السابق كوسيط. استخدم وظيفة write() وأضف output كوسيط للوصول إلى البيانات المسلسلة التي جمعتها من محطة المراقبة.

اتجه نحو علامة X المضيئة فوق السجادة الزرقاء في المكتب، على الطرفية سوف نتحقق من البروتوكولات لتحديد نوع التسلسل الذي ستستخدمه وحدة pickle عند معالجة البيانات. في وظيفة write() المكتوبة مسبقاً، عين الوسائط كـ pickle.DEFAULT_PROTOCOL و pickle.HIGHEST_PROTOCOL. وهذا سيتحقق من بروتوكول التسلسل الحالي وكذلك أحدث بروتوكول للتسلسل المتاح في ذلك الوقت.

انتقل إلى علامة X الداكنة فوق السجادة الزرقاء، الآن بعد أن أكدنا البروتوكولات، يمكننا التحقق من البيانات المخزنة. تم جمع البيانات وتخزينها على مدى الشهور وتخزينها في ثابت يُدعى samples. أنشئ ثلاثة متغيرات باسم: sereal_0، sereal_2 و sereal_5؛ سوف نستخدم هذه للتحقق من ثلاثة من البروتوكولات المتاحة للتسلسل. البروتوكول 0 هو ASCII قابل للقراءة، غير فعال جداً، والبروتوكول 2 هو صيغة ثنائية أكثر كفاءة، والبروتوكول 5 هو الأحدث مع إضافة أكثر الميزات تعقيداً.

سنخزن قيمة pickle.dumps() ونحدد كوسائط الثابت samples وprotocol المطابق للرقم في اسم المتغير. على سبيل المثال، بالنسبة لـ sereal_0 سنحدد protocol كـ 0، كما في المثال: sereal_0 = pickle.dumps(samples, protocol=0). استخدم sereal_0، sereal_2 و sereal_5 مع الوظيفة المكتوبة مسبقاً display() للتحقق من كيفية اختلاف التسلسل لكل بروتوكول.

اتجه نحو علامة X المضيئة فوق السجادة الحمراء وواجه الطرفية، أعد كتابة متغير output وخزن قيمة pickle.loads() مع تعيين وسيط إلى sereal_5 لفك تسلسل بيانات العينة التي تم جمعها حتى الآن. استخدم وظيفة display() وأضف وظيفة pprint() مع متغير output من أجل عرض البيانات. كما في المثال: await player.display(pprint(output)). قم بتدوين التقييمات لكل شهر المعروضة في الطرفية حتى تتمكن من رسمها لاحقاً.

اتجه نحو علامة X الداكنة فوق السجادة الحمراء وواجه المكتب، في وظيفة write() المكتوبة مسبقاً، أضف التقييمات التي دونتها لكل شهر، والتي تم عرضها سابقاً في الطرفية. أضفها كسلاسل نصية مع علامات "" بالترتيب الصحيح كما هو موضح في الوظيفة لإكمال المستوى.

كتاب الكود