تعلم لغة Python الفصل 10 : الملفات والاستثناءات (FILES AND EXCEPTIONS) الجزء 3 والأخيرة

sparrow
0

 



الفصل : 10

الجزء : 3

العنوان : الملفات والاستثناءات (FILES AND EXCEPTIONS)






تخزين البيانات


ستطلب العديد من برامجك من المستخدمين إدخال أنواع معينة من المعلومات. قد تسمح للمستخدمين بتخزين تفضيلاتهم في لعبة أو تقديم بيانات للتصور. بغض النظر عن تركيز برنامجك، ستخزن المعلومات التي يوفرها المستخدمون في هياكل البيانات مثل القوائم (lists) والقواميس (dictionaries). عندما يغلق المستخدمون برنامجًا، ستريد تقريبًا دائمًا حفظ المعلومات التي أدخلوها. طريقة بسيطة للقيام بذلك تتضمن تخزين بياناتك باستخدام وحدة json.


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


ملاحظة

تم تطوير تنسيق JSON (JavaScript Object Notation) في الأصل من أجل JavaScript. ومع ذلك، أصبح منذ ذلك الحين تنسيقًا شائعًا يستخدمه العديد من اللغات، بما في ذلك Python.

 


استخدام json.dumps() و json.loads()


لنكتب برنامجًا قصيرًا يخزن مجموعة من الأرقام وبرنامجًا آخر يقرأ هذه الأرقام مرة أخرى في الذاكرة. سيستخدم البرنامج الأول json.dumps() لتخزين مجموعة الأرقام، وسيستخدم البرنامج الثاني json.loads().

تأخذ دالة json.dumps() وسيطًا واحدًا: قطعة من البيانات التي يجب تحويلها إلى تنسيق JSON. تعيد الدالة سلسلة نصية، والتي يمكننا بعد ذلك كتابتها إلى ملف بيانات:



أولاً نستورد وحدة json، ثم ننشئ قائمة من الأرقام للعمل بها. بعد ذلك نختار اسم ملف لتخزين قائمة الأرقام ❶. من المعتاد استخدام الامتداد .json للإشارة إلى أن البيانات في الملف مخزنة بتنسيق JSON. بعد ذلك، نستخدم دالة json.dumps() ❷ لإنشاء سلسلة تحتوي على التمثيل بتنسيق JSON للبيانات التي نعمل معها. بمجرد حصولنا على هذه السلسلة، نكتبها إلى الملف باستخدام نفس الطريقة write_text() التي استخدمناها سابقًا.


هذا البرنامج ليس له مخرجات، لكن دعونا نفتح ملف numbers.json ونلقي نظرة عليه. البيانات مخزنة بتنسيق يشبه Python:


الآن سنكتب برنامجًا منفصلاً يستخدم json.loads() لقراءة القائمة مرة أخرى إلى الذاكرة:

`


نتأكد من القراءة من نفس الملف الذي كتبنا إليه ❶. نظرًا لأن ملف البيانات هو مجرد ملف نصي بتنسيق محدد، يمكننا قراءته باستخدام الطريقة read_text() ❷. بعد ذلك نمرر محتويات الملف إلى json.loads() ❸. تأخذ هذه الدالة سلسلة بتنسيق JSON وتعيد كائن Python (في هذه الحالة، قائمة)، والتي نعطيها إلى المتغير numbers. أخيرًا، نطبع قائمة الأرقام المسترجعة ونرى أنها نفس القائمة التي تم إنشاؤها في number_writer.py:


هذه طريقة بسيطة لمشاركة البيانات بين برنامجين.


حفظ وقراءة البيانات المولدة بواسطة المستخدم


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

لنبدأ بتخزين اسم المستخدم:


أولاً نطلب إدخال اسم المستخدم لتخزينه ❶. بعد ذلك، نكتب البيانات التي جمعناها للتو إلى ملف يسمى username.json ❷. ثم نطبع رسالة لإعلام المستخدم بأننا قمنا بتخزين معلوماته ❸:


الآن دعونا نكتب برنامجًا جديدًا يرحب بالمستخدم الذي تم تخزين اسمه بالفعل:



نقرأ محتويات ملف البيانات ❶ ثم نستخدم json.loads() لتعيين البيانات المسترجعة إلى المتغير username ❷. بما أننا استرجعنا اسم المستخدم، يمكننا الترحيب بالمستخدم بترحيب شخصي:


نحتاج إلى دمج هذين البرنامجين في ملف واحد. عندما يشغل شخص ما remember_me.py، نريد استرجاع اسم المستخدم من الذاكرة إذا كان ذلك ممكنًا؛ وإذا لم يكن كذلك، سنطلب اسم المستخدم ونخزنه في username.json للمرة القادمة. يمكننا كتابة كتلة try-except هنا للاستجابة بشكل مناسب إذا لم يكن username.json موجودًا، ولكن بدلاً من ذلك سنستخدم طريقة مفيدة من وحدة pathlib:


هناك العديد من الطرق المفيدة التي يمكنك استخدامها مع كائنات Path. تعيد الطريقة exists قيمة () True إذا كان الملف أو المجلد موجودًا و False إذا لم يكن كذلك. هنا نستخدم path.exists() لمعرفة ما إذا كان اسم المستخدم قد تم تخزينه بالفعل ❶. إذا كان username.json موجودًا، نقوم بتحميل اسم المستخدم وطباعة ترحيب شخصي للمستخدم.

إذا لم يكن ملف username.json موجودًا ❷، نطلب اسم المستخدم ونخزن القيمة التي أدخلها المستخدم. كما نطبع الرسالة المألوفة بأننا سنتذكره عند عودته.

أيًا كان الكتلة التي تنفذ، النتيجة هي اسم مستخدم وترحيب مناسب. إذا كانت هذه هي المرة الأولى التي يتم فيها تشغيل البرنامج، فهذه هي المخرجات:


وإلا:


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


إعادة الهيكلة (Refactoring)


غالبًا، ستصل إلى نقطة يكون فيها الكود يعمل، ولكنك ستدرك أنه يمكنك تحسين الكود بتقسيمه إلى سلسلة من الدوال التي لديها وظائف محددة. تُعرف هذه العملية باسم إعادة الهيكلة (Refactoring). تجعل إعادة الهيكلة الكود أكثر نظافة وأسهل في الفهم وأسهل في التمديد.

يمكننا إعادة هيكلة remember_me.py بنقل الجزء الأكبر من منطقه إلى واحدة أو أكثر من الدوال. يركز remember_me.py على الترحيب بالمستخدم، لذا دعونا ننقل كل كودنا الحالي إلى دالة تسمى greet_user():




لأننا نستخدم الآن دالة، نعيد كتابة التعليقات كـ docstring يعكس كيفية عمل البرنامج حاليًا ❶. هذا الملف أصبح أكثر نظافة قليلاً، ولكن الدالة greet_user() تقوم بأكثر من مجرد الترحيب بالمستخدم - إنها أيضًا تسترجع اسم المستخدم المخزن إذا كان موجودًا وتطلب اسم مستخدم جديد إذا لم يكن موجودًا.

دعونا نعيد هيكلة greet_user() بحيث لا تقوم بالكثير من المهام المختلفة. سنبدأ بنقل الكود الخاص باسترجاع اسم المستخدم المخزن إلى دالة منفصلة:



الدالة الجديدة get_stored_username() ❶ لها غرض واضح، كما هو مذكور في docstring. تسترجع هذه الدالة اسم مستخدم مخزن وتعيد اسم المستخدم إذا وجدته. إذا كان المسار الذي يُمرر إلى get_stored_username() غير موجود، تعيد الدالة None ❷. هذه ممارسة جيدة: يجب أن تعيد الدالة إما القيمة التي تتوقعها، أو تعيد None. هذا يسمح لنا بإجراء اختبار بسيط مع قيمة العائد من الدالة. نطبع رسالة ترحيب للمستخدم إذا كان المحاولة لاسترجاع اسم المستخدم ناجحة ❸، وإذا لم تكن كذلك، نطلب اسم مستخدم جديد.

يجب علينا فصل كتلة كود أخرى من greet_user(). إذا لم يكن اسم المستخدم موجودًا، يجب أن ننقل الكود الذي يطلب اسم مستخدم جديد إلى دالة مخصصة لهذا الغرض:


كل دالة في هذا الإصدار النهائي من remember_me.py لها غرض واحد وواضح. نحن نستدعي greet_user()، وتقوم تلك الدالة بطباعة رسالة مناسبة: إما ترحب بالمستخدم الحالي أو ترحب بمستخدم جديد. تقوم بذلك عن طريق استدعاء get_stored_username() ❶، التي تكون مسؤولة فقط عن استرجاع اسم مستخدم مخزن إذا كان موجودًا. أخيرًا، إذا لزم الأمر، تستدعي greet_user() get_new_username()❷، التي تكون مسؤولة فقط عن الحصول على اسم مستخدم جديد وتخزينه. هذا الفصل في العمل هو جزء أساسي من كتابة كود واضح يسهل صيانته وتمديده.




حاول بنفسك

تمرين 10-11. الرقم المفضل: اكتب برنامجًا يطلب من المستخدم إدخال رقمه المفضل. استخدم `json.dumps()` لتخزين هذا الرقم في ملف. اكتب برنامجًا منفصلًا يقرأ هذه القيمة ويطبع الرسالة "أعرف رقمك المفضل! إنه _____."


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


تمرين 10-13. قاموس المستخدم: مثال remember_me.py يخزن فقط معلومة واحدة، وهي اسم المستخدم. قم بتوسيع هذا المثال عن طريق طلب معلومتين إضافيتين عن المستخدم، ثم خزن كل المعلومات التي تجمعها في قاموس. اكتب هذا القاموس إلى ملف باستخدام `json.dumps()`، وقرأه مرة أخرى باستخدام `json.loads()`. اطبع ملخصًا يوضح بالضبط ما يتذكره برنامجك عن المستخدم.


تمرين 10-14. التحقق من المستخدم: يفترض القائمة النهائية لـ remember_me.py إما أن المستخدم قد أدخل اسمه بالفعل أو أن البرنامج يعمل لأول مرة. يجب علينا تعديله في حالة أن المستخدم الحالي ليس الشخص الذي استخدم البرنامج آخر مرة. قبل طباعة رسالة الترحيب في `greet_user()`، اسأل المستخدم إذا كان هذا هو اسم المستخدم الصحيح. إذا لم يكن كذلك، استدع `get_new_username()` للحصول على اسم المستخدم الصحيح.


 


الملخص


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


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


النهاية


نكون هنا انتهينا من الفصل 10 من منهج تعلم Python من كتاب python crash course بالعربية 


واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا  


او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله 


ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من     هنا 


يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من  

هنا


وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock 


Tags

إرسال تعليق

0تعليقات

إرسال تعليق (0)

#buttons=(موافق!) #days=(20)

يستخدم موقعنا ملفات تعريف الارتباط لتحسين تجربتك. تاكد الان
Ok, Go it!