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