دورة تطوير بايثون المتقدمة
الفصل
>
المستوى
وحدات التسلسل
وحدات مارشال و بيكل
الهدف
اذهب إلى محطة الخدمة وتأكد من تخزين البيانات بشكل صحيح باستخدام وحدة JSON لتنسيق الملفات.
بينما نمضي في الطريق، نجد بعض المحطات التي تراقب توزيع المياه وجودة التربة للأرض التي يجري تطويرها لمحصول مستقبلي. ولتتم معالجة البيانات بشكل فعال فإنه من المناسب تسلسل البيانات. وبينما يمكن أن يكون استخدام Json حلاً عامًا فعالاً، هناك أيضًا بعض طرق التسلسل الخاصة بلغة python، وهي وحدة Marshal ووحدة Pickle. تم تصميم وحدة Marshal للتسلسل/عدم التسلسل السريع عن طريق تحويل البيانات إلى ثنائية، وهو مثالي لنقل البيانات البسيطة. أما وحدة Pickle فهي أبطأ ولكنها مصممة لمعالجة هياكل البيانات الأكثر تعقيدًا وتتميز بمرونة أكبر، مما يجعلها مثالية لهياكل البيانات الأكبر أو ذات الأولوية.
لاستخدام وحدتي Marshal و Pickle، قم باستيراد وظائفهما بكتابة: import marshal و import pickle. لأغراضنا، سنستخدم الدوال التالية:
marshal.dumps(): تقوم بتسلسل البيانات إلى تنسيق ثنائي، ومصممة لتحقيق السرعة في python. تأخذ وسيطًا واحدًا، وهو البيانات التي ترغب في تسلسلها، وتقتصر على أنواع البيانات الأساسية.marshal.loads(): تقوم بعدم تسلسل البيانات الثنائية إلى أنواع بيانات python المقروءة، مع قدرات محدودة ولكن تنفيذ سريع. تأخذ وسيطًا واحدًا، وهو البيانات التي ستعيد تسلسلها.pickle.DEFAULT_PROTOCOL: يتحقق من إصدار البروتوكول الافتراضي لتسلسل Pickle في إصدار Python الخاص بك. تؤثر البروتوكولات على كيفية تسلسل البيانات.pickle.HIGHEST_PROTOCOL: يتحقق من أعلى إصدار بروتوكول لتسلسل Pickle المتاح في إصدار Python الخاص بك. تؤثر البروتوكولات على كيفية تسلسل البيانات.pickle.dumps(): تقوم بتسلسل هياكل البيانات المعقدة في python إلى تنسيق ثنائي وفقًا للبروتوكول المستخدم. تأخذ وسيطين، البيانات التي ترغب في تسلسلها وإصدار البروتوكول الذي ترغب في استخدامه أثناء التسلسل.pickle.loads(): تقوم بعدم تسلسل البيانات الثنائية إلى أنواع بيانات python المقروءة، وتعمل بفعالية مع كائنات Python. تأخذ وسيطًا واحدًا، وهو البيانات التي ترغب في عدم تسلسلها.
بالإضافة إلى هذه الوحدات والوظائف، سنستخدم أيضًا وحدة تنسيق تُسمى pformat، والتي سنستوردها باستخدام from pprint import pformat. هذا يتيح لنا استخدام الدالة pformat() التي يمكن استخدامها لتنسيق هياكل البيانات مثل القواميس مما يسمح لنا بعرض المعلومات بوضوح.
لبدء المهمة، توجه إلى علامة X المضيئة داخل محطة المراقبة الصغيرة وواجه وحدة الكمبيوتر. تراقب المحطة ضغط المياه وظروف التربة للتضاريس القريبة التي يجري تطويرها لزراعة المحاصيل. يوجد ثابت يُسمى reading، يحتوي على بيانات Python التي جُمعت من قبل المحطة.
قم بإنشاء متغير باسم 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() مع تعيين الوسيطين الثابت sample وإصدار 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() وأضف إليها دالة pformat() مع المتغير output لعرض البيانات. مثل هذا: await player.display(pformat(output)). قم بتدوين التقييمات لكل شهر المعروضة على وحدة الكمبيوتر حتى تتمكن من رسمها لاحقًا.
توجه إلى علامة X الداكنة على السجادة الحمراء وواجه المكتب، في دالة write() المكتوبة مسبقًا، أضف التقييمات التي قمت بتدوينها لكل شهر، والتي عُرضت سابقًا على وحدة الكمبيوتر. أضفها كسلاسل نصية مع علامات "" بالترتيب الصحيح كما هو موضح في الدالة لإكمال المستوى.