الفصل الثامن: التعامل مع الملفات (File Handling)
مقدمة الفصل
فكر في برنامجك كجلسة محادثة. كل المعلومات التي تناقشونها (المتغيرات، القوائم) تكون موجودة في ذاكرتكم المؤقتة (RAM). بمجرد انتهاء المحادثة (إغلاق البرنامج)، تُنسى كل هذه التفاصيل.
لكن ماذا لو أردت كتابة رسالة أو تدوين ملاحظة أثناء المحادثة لحفظها بشكل دائم؟ هذا بالضبط ما يفعله التعامل مع الملفات (File Handling). إنه يسمح لبرنامجك بقراءة وكتابة المعلومات في ملفات على القرص الصلب، بحيث تبقى هذه المعلومات موجودة حتى بعد إغلاق البرنامج.
في هذا الفصل، سنتعلم كيف نجعل برامجنا تقوم بـ:
- قراءة البيانات من ملفات نصية موجودة.
- كتابة بيانات جديدة إلى ملفات.
- إضافة بيانات جديدة إلى نهاية ملف موجود دون مسح محتواه.
هذه المهارة أساسية لبناء أي تطبيق حقيقي، من برامج تدوين الملاحظات البسيطة إلى تطبيقات إدارة قواعد البيانات المعقدة.
1. بوابة التعامل مع الملفات: دالة open()
الخطوة الأولى دائمًا هي فتح الملف الذي نريد التعامل معه. فكر في الأمر كأنك تريد أخذ ملف من خزانة ملفات؛ عليك أولاً أن تجد الدرج الصحيح وتفتحه. في بايثون، نستخدم دالة open()
المدمجة لهذا الغرض.
عندما نفتح ملفًا، فإن بايثون لا تعطينا محتويات الملف مباشرة، بل تعطينا “كائن ملف” (File Object) أو ما يمكن تشبيهه بـ “جهاز تحكم عن بعد” للملف. نحن نستخدم جهاز التحكم هذا لإصدار الأوامر، مثل “اكتب هذا النص” أو “اقرأ السطر التالي”.
لفتح ملف، يجب أن نحدد شيئين أساسيين: اسم الملف، والوضع (mode) الذي نريد فتحه به.
أهم أوضاع فتح الملفات:
الوضع | اسم الوضع | الوصف |
---|---|---|
'r' |
Read (قراءة) | يفتح الملف للقراءة فقط. هذا هو الوضع الافتراضي إذا لم تحدد وضعًا. يسبب خطأ إذا كان الملف غير موجود. |
'w' |
Write (كتابة) | يفتح الملف للكتابة. ⚠️ تحذير: إذا كان الملف موجودًا، سيتم مسح محتواه بالكامل! إذا لم يكن موجودًا، سيقوم بإنشائه. |
'a' |
Append (إضافة) | يفتح الملف لإضافة بيانات جديدة في نهايته، مثل إضافة ملاحظة جديدة في آخر صفحة من دفترك. لا يمسح المحتوى الحالي. إذا لم يكن موجودًا، سيقوم بإنشائه. |
2. الطريقة المثلى للتعامل مع الملفات: with open()
في الماضي، كان على المبرمجين أن يتذكروا دائمًا إغلاق الملف يدويًا باستخدام file.close()
. نسيان هذه الخطوة قد يسبب مشاكل، مثل عدم حفظ البيانات أو بقاء الملف “محجوزًا”.
لحسن الحظ، توفر بايثون طريقة أفضل وأكثر أمانًا تضمن إغلاق الملف تلقائيًا، وهي باستخدام جملة with
.
فكر في جملة with
كأنك توظف مساعدًا أمينًا. أنت تقول له: “أريد العمل على هذا الملف”. تقوم بعملك داخل “مساحة العمل” التي يوفرها لك، وبمجرد أن تنتهي وتغادر هذه المساحة، يقوم المساعد تلقائيًا بإغلاق الملف وترتيب كل شيء بشكل آمن، حتى لو حدث خطأ غير متوقع.
# 'with' تضمن إغلاق الملف تلقائيًا
# 'f' هو الاسم الذي اخترناه لـ "جهاز التحكم عن بعد" الخاص بالملف
with open("greeting.txt", "w", encoding="utf-8") as f:
# كل الأوامر داخل هذه الكتلة تستخدم المتغير f للتفاعل مع الملف
f.write("مرحبًا من بايثون!\n")
f.write("هذه هي الطريقة الآمنة لكتابة الملفات.")
# هنا، خارج كتلة with، تم إغلاق الملف تلقائيًا. لا حاجة لكتابة f.close()
شرح البنية:
with open(...) as f:
: هذه هي البنية الأساسية.f
هو مجرد اسم متغير شائع لكائن الملف، يمكنك اختيار أي اسم آخر.encoding="utf-8"
: هذا جزء مهم جدًا، خاصة عند التعامل مع نصوص غير إنجليزية مثل اللغة العربية.utf-8
هو معيار ترميز عالمي يسمح بتخزين وعرض جميع الأحرف والرموز بشكل صحيح. اعتد دائمًا على إضافةencoding="utf-8"
عند التعامل مع الملفات النصية لتجنب أي مشاكل مستقبلية.
3. كتابة البيانات في الملفات
الآن لنتعمق في كيفية الكتابة.
الكتابة باستخدام .write()
الوصف:
دالة .write()
هي الأمر الأساسي لكتابة نص (string) في ملف. ستقوم بالكتابة في المكان الحالي لـ “مؤشر” الملف. في وضع الكتابة ('w'
) ووضع الإضافة ('a'
)، يكون المؤشر في نهاية الملف.
# فتح ملف في وضع الكتابة 'w' سيمسح محتواه إن كان موجودًا
with open("shopping_list.txt", "w", encoding="utf-8") as file:
file.write("قائمة التسوق:\n") # \n لإضافة سطر جديد
file.write("- حليب\n")
file.write("- خبز\n")
file.write("- بيض\n")
print("تم إنشاء قائمة التسوق بنجاح!")
الشرح:
استخدمنا \n
في نهاية كل سطر لضمان أن كل عنصر يأتي على سطر منفصل. بدون \n
، سيتم كتابة كل النصوص ملتصقة ببعضها في سطر واحد: قائمة التسوق:- حليب- خبز- بيض
.
4. قراءة البيانات من الملفات
بعد أن كتبنا في ملف، نحتاج إلى طريقة لقراءة محتواه.
ملاحظة هامة: إذا حاولت فتح ملف للقراءة ('r'
) وهو غير موجود، سيتوقف برنامجك مع خطأ FileNotFoundError
. سنتعلم كيفية التعامل مع هذه الأخطاء بأناقة في الفصل القادم. الآن، سنفترض أن الملف موجود.
طرق القراءة المختلفة
قراءة الملف بالكامل: .read()
الوصف:
تشبه هذه الطريقة “قراءة الكتاب بالكامل في جلسة واحدة”. تقوم دالة .read()
بقراءة محتوى الملف بالكامل من البداية إلى النهاية وتعيده كنص واحد كبير (string). هذه الطريقة مناسبة للملفات الصغيرة.
with open("shopping_list.txt", "r", encoding="utf-8") as file:
# قراءة محتوى الملف بالكامل وتخزينه في متغير
full_content = file.read()
print("--- محتوى الملف الكامل ---")
print(full_content)
الشرح:
المتغير full_content
يحتوي الآن على كل النص الموجود في الملف، بما في ذلك رموز السطر الجديد \n
.
قراءة الملف سطراً بسطر: حلقة for
الوصف:
هذه هي الطريقة الأكثر كفاءة وأمانًا لقراءة معظم الملفات، خاصة الكبيرة منها. إنها تشبه “قراءة الكتاب صفحة بصفحة”. بدلاً من تحميل الملف بأكمله في الذاكرة، تقوم حلقة for
بقراءة سطر واحد فقط في كل دورة.
print("\n--- قراءة الملف سطراً بسطر ---")
with open("shopping_list.txt", "r", encoding="utf-8") as file:
# المرور على كل سطر في كائن الملف
for line in file:
# .strip() تزيل أي مسافات فارغة أو أسطر جديدة من بداية ونهاية السطر
print(f"السطر الحالي: {line.strip()}")
الشرح:
في كل دورة، يحتوي المتغير line
على نص السطر الحالي، بما في ذلك رمز \n
غير المرئي في نهايته. نستخدم line.strip()
لإزالة هذا الرمز والحصول على طباعة نظيفة.
قراءة كل الأسطر في قائمة: .readlines()
الوصف: هذه الطريقة تقرأ كل الأسطر في الملف وتعيدها كـ قائمة (list)، حيث يكون كل عنصر في القائمة هو نص يمثل سطراً من الملف.
with open("shopping_list.txt", "r", encoding="utf-8") as file:
# قراءة كل الأسطر وتخزينها في قائمة
lines_list = file.readlines()
print("\n--- الأسطر كقائمة ---")
print(lines_list)
# الوصول للسطر الثاني (فهرس 1)
print(f"السطر الثاني من القائمة: {lines_list[1].strip()}")
5. الإضافة إلى نهاية ملف ('a'
)
الوصف:
إذا أردت إضافة بيانات جديدة إلى ملف دون مسح محتواه الحالي، استخدم وضع الإضافة 'a'
. هذا الوضع مثالي لملفات السجل (log files) أو دفاتر الملاحظات.
# فتح الملف في وضع الإضافة 'a'
with open("system_log.txt", "a", encoding="utf-8") as log_file:
log_file.write("فحص النظام نجح في الساعة 10:00 صباحًا.\n")
log_file.write("المستخدم 'أحمد' قام بتسجيل الدخول.\n")
print("تم تحديث ملف السجل.")
الشرح:
إذا كان ملف system_log.txt
موجودًا، فسيتم إضافة هذين السطرين في نهايته. إذا قمت بتشغيل هذا الكود مرة أخرى، فستتم إضافة السطرين مرة أخرى أسفل المحتوى القديم.
6. تمرين تطبيقي: دفتر ملاحظات بسيط
المطلوب:
كتابة برنامج بسيط يسمح للمستخدم بتدوين ملاحظاته وحفظها في ملف notes.txt
. كل ملاحظة جديدة يجب أن تُضاف إلى نهاية الملف دون حذف الملاحظات السابقة.
الحل المقترح خطوة بخطوة:
الخطوة 1: التفكير في المنطق
نحتاج إلى أن نطلب من المستخدم إدخال ملاحظة. بعد ذلك، يجب أن نفتح ملفًا بطريقة تضمن عدم مسح الملاحظات القديمة. الوضع 'a'
(append) هو الأداة المثالية لهذا.
الخطوة 2: كتابة الكود
# --- برنامج تدوين الملاحظات البسيط ---
# 1. اطلب من المستخدم إدخال ملاحظته
# نستخدم دالة input لعرض رسالة للمستخدم، وننتظر منه كتابة ملاحظته.
# النص الذي يكتبه يتم تخزينه في المتغير note_text.
note_text = input("الرجاء إدخال ملاحظتك ليتم حفظها: ")
# 2. افتح الملف في وضع الإضافة 'a' واكتب الملاحظة
# نستخدم 'with' لضمان إغلاق الملف تلقائيًا وأمان.
# الوضع 'a' سيضيف إلى نهاية الملف، أو سينشئ الملف إذا لم يكن موجودًا.
# 'encoding="utf-8"' ضروري لدعم اللغة العربية.
try:
with open("notes.txt", "a", encoding="utf-8") as file_object:
# نستخدم .write لكتابة الملاحظة
# ونضيف "\n" في النهاية لضمان أن الملاحظة التالية ستبدأ على سطر جديد.
file_object.write(note_text + "\n")
# 3. نطبع رسالة تأكيد للمستخدم
# من الجيد دائمًا إعطاء المستخدم تغذية راجعة (feedback) لتأكيد نجاح العملية.
print("تم حفظ ملاحظتك بنجاح!")
except Exception as e:
# في حال حدوث أي خطأ أثناء محاولة الكتابة في الملف، نطبع رسالة خطأ
print(f"حدث خطأ أثناء حفظ الملف: {e}")
كيف يعمل؟
في كل مرة تقوم فيها بتشغيل هذا البرنامج، سيطلب منك ملاحظة جديدة ويضيفها إلى نهاية ملف notes.txt
، مما يبني دفتر ملاحظاتك مع مرور الوقت.
7. خلاصة الفصل
- التعامل مع الملفات يسمح لبرامجك بحفظ واسترجاع البيانات بشكل دائم، مما يجعلها أكثر فائدة وقوة.
- استخدم دائمًا بنية
with open
لأنها الطريقة الأكثر أمانًا وموثوقية، حيث تتكفل بإغلاق الملف تلقائيًا. - تذكر تحديد وضع الفتح المناسب:
'r'
للقراءة،'w'
للكتابة (مع مسح المحتوى بالكامل)، و'a'
للإضافة إلى النهاية. - لا تنسَ أبدًا استخدام
encoding="utf-8"
عند التعامل مع نصوص باللغة العربية أو أي لغات أخرى لضمان عرضها بشكل صحيح.
تمارين تطبيقية مع الحلول
التمرين 1: كتابة بطاقة وصف
المطلوب:
اكتب برنامجًا يسأل المستخدم عن اسم كتابه المفضل واسم المؤلف. يجب على البرنامج إنشاء ملف جديد باسم book_card.txt
وكتابة هذه المعلومات فيه بشكل منظم.
الحل:
# --- برنامج بطاقة الوصف ---
# 1. سؤال المستخدم عن المعلومات
book_title = input("ما هو عنوان كتابك المفضل؟ ")
book_author = input("من هو مؤلف الكتاب؟ ")
# 2. فتح الملف في وضع الكتابة 'w'
# سيقوم هذا الوضع بإنشاء الملف أو الكتابة فوقه إذا كان موجودًا
with open("book_card.txt", "w", encoding="utf-8") as file:
file.write("--- بطاقة الكتاب المفضلة ---\n")
file.write(f"العنوان: {book_title}\n")
file.write(f"المؤلف: {book_author}\n")
print("تم حفظ بطاقة الوصف بنجاح في 'book_card.txt'.")
شرح الحل:
يستخدم هذا البرنامج الوضع 'w'
لإنشاء ملف جديد أو مسح محتواه القديم. نستخدم f-string
لتنسيق المعلومات التي أدخلها المستخدم ونستخدم \n
في نهاية كل سطر لضمان أن كل معلومة تأتي على سطر منفصل.
التمرين 2: قراءة وعرض ملف
المطلوب:
اكتب برنامجًا يقرأ ملف book_card.txt
(الذي تم إنشاؤه في التمرين السابق) ويطبع محتواه بالكامل على الشاشة. (افترض أن الملف موجود).
الحل:
# --- برنامج قراءة الملف ---
# ملاحظة: يفترض هذا الكود أن ملف 'book_card.txt' موجود في نفس المجلد
# 1. فتح الملف في وضع القراءة 'r'
with open("book_card.txt", "r", encoding="utf-8") as file:
# 2. قراءة المحتوى بالكامل في متغير واحد
content = file.read()
# 3. طباعة المحتوى
print("--- محتويات الملف ---")
print(content)
شرح الحل:
نفتح الملف في وضع القراءة 'r'
. دالة .read()
تقرأ كل النص الموجود في الملف كقطعة واحدة (string)، ونقوم بتخزينه في المتغير content
ثم طباعته.
التمرين 3: قائمة أمنيات
المطلوب:
اكتب برنامجًا، في كل مرة يتم تشغيله، يسأل المستخدم عن أمنية أو هدف جديد. يجب على البرنامج إضافة هذه الأمنية في نهاية ملف يسمى wishes.txt
دون مسح الأمنيات السابقة.
الحل:
# --- برنامج قائمة الأمنيات ---
# 1. سؤال المستخدم عن أمنيته الجديدة
new_wish = input("ما هي الأمنية الجديدة التي تريد إضافتها؟ ")
# 2. فتح الملف في وضع الإضافة 'a'
with open("wishes.txt", "a", encoding="utf-8") as file:
# 3. كتابة الأمنية الجديدة في نهاية الملف، متبوعة بسطر جديد
file.write(new_wish + "\n")
print("تمت إضافة أمنيتك إلى القائمة!")
شرح الحل:
المفتاح هنا هو استخدام وضع الإضافة 'a'
. هذا الوضع يضمن أن أي كتابة جديدة ستتم في نهاية الملف، مما يحافظ على كل المحتوى القديم. نضيف \n
لضمان أن كل أمنية تكون على سطر خاص بها.
التمرين 4: عرض قائمة الأصدقاء
المطلوب:
أنشئ ملفًا يدويًا باسم friends.txt
واكتب فيه 4 أسماء، كل اسم على سطر. اكتب برنامجًا يقرأ هذا الملف باستخدام .readlines()
، ثم يطبع جملة تخبر المستخدم بعدد أصدقائه في القائمة، ثم يطبع اسم الصديق الثاني في القائمة (في الفهرس 1).
الحل:
# --- برنامج عرض الأصدقاء ---
# أولاً، أنشئ ملفًا اسمه "friends.txt" وضع فيه أسماء مثل:
# علي
# فاطمة
# يوسف
# مريم
# 1. فتح الملف للقراءة
with open("friends.txt", "r", encoding="utf-8") as file:
# 2. قراءة كل الأسطر وتخزينها في قائمة
friends_list = file.readlines()
# 3. طباعة عدد الأصدقاء
print(f"لديك {len(friends_list)} أصدقاء في قائمتك.")
# 4. طباعة الصديق الثاني (في الفهرس 1)
# نتأكد أولاً أن القائمة تحتوي على عنصرين على الأقل
if len(friends_list) >= 2:
# نستخدم .strip() لإزالة رمز السطر الجديد \n
second_friend = friends_list[1].strip()
print(f"صديقك الثاني في القائمة هو: {second_friend}")
شرح الحل:
دالة .readlines()
تقرأ كل الأسطر وتعيدها كقائمة من النصوص. بعد ذلك، نتعامل مع المتغير friends_list
كأي قائمة بايثون عادية، حيث نستخدم len()
لمعرفة طولها والفهرسة [1]
للوصول إلى العنصر الثاني.
التمرين 5: حفظ قائمة التسوق في ملف
المطلوب:
لديك قائمة تسوق معرفة مسبقًا في بايثون. اكتب برنامجًا يمر على كل عنصر في القائمة ويكتبه في ملف shopping.txt
، بحيث يكون كل عنصر على سطر منفصل.
الحل:
# --- برنامج حفظ قائمة التسوق ---
# 1. تعريف القائمة
shopping_items = ["خبز", "جبن", "عصير", "تفاح"]
# 2. فتح الملف في وضع الكتابة 'w'
with open("shopping.txt", "w", encoding="utf-8") as file:
# 3. المرور على كل عنصر في القائمة
for item in shopping_items:
# 4. كتابة العنصر متبوعًا بسطر جديد
file.write(item + "\n")
print("تم حفظ قائمة التسوق بنجاح.")
شرح الحل:
نستخدم حلقة for
للمرور على كل عنصر في قائمة shopping_items
. داخل الحلقة، نستخدم file.write()
لكتابة العنصر الحالي. من الضروري إضافة "\n"
يدويًا بعد كل عنصر لضمان أن يتم كتابة كل عنصر على سطر جديد في الملف الناتج.
التمرين 6: معالجة ملف سطراً بسطر
المطلوب:
اكتب برنامجًا يقرأ ملف shopping.txt
(من التمرين السابق) سطراً بسطر. في كل سطر، يجب أن يطبع البرنامج رسالة منسقة مثل: “يجب شراء: [اسم المنتج]”.
الحل:
# --- برنامج معالجة قائمة التسوق ---
# يفترض هذا الحل أن ملف "shopping.txt" موجود من التمرين السابق
# 1. فتح الملف للقراءة
with open("shopping.txt", "r", encoding="utf-8") as file:
print("--- قائمة التسوق ---")
# 2. المرور على كل سطر في الملف
for line in file:
# 3. طباعة السطر بعد تنظيفه من أي مسافات زائدة
item_name = line.strip()
print(f"يجب شراء: {item_name}")
شرح الحل:
هذا التمرين يوضح الطريقة الأكثر كفاءة لقراءة الملفات. حلقة for line in file:
تقرأ الملف سطراً واحداً في كل مرة. المتغير line
يحتوي على النص مع رمز السطر الجديد \n
في نهايته، لذلك نستخدم line.strip()
لإزالته قبل الطباعة للحصول على مخرجات نظيفة.
التمرين 7: إنشاء ملف بيانات بسيط
المطلوب:
اكتب برنامجًا يسأل المستخدم عن اسمه وعن مدينته. يجب على البرنامج حفظ هذه البيانات في ملف data.txt
على سطر واحد، مفصولة بفاصلة. على سبيل المثال: أحمد,الرياض
.
الحل:
# --- برنامج إنشاء ملف بيانات ---
# 1. سؤال المستخدم عن البيانات
user_name = input("أدخل اسمك: ")
user_city = input("أدخل اسم مدينتك: ")
# 2. فتح الملف في وضع الكتابة
with open("data.txt", "w", encoding="utf-8") as file:
# 3. كتابة البيانات منسقة على سطر واحد
file.write(f"{user_name},{user_city}")
print("تم حفظ البيانات بنجاح.")
شرح الحل:
نستخدم f-string
لتنسيق السلسلة النصية النهائية بالشكل المطلوب (name,city
) ونكتبها في الملف باستخدام file.write()
. لم نضف \n
لأن المطلوب هو كتابة البيانات على سطر واحد فقط.
التمرين 8: قراءة ملف بيانات بسيط
المطلوب:
اكتب برنامجًا يقرأ ملف data.txt
(من التمرين السابق). يجب أن يقوم البرنامج بقراءة السطر، وتقسيمه عند الفاصلة، ثم طباعة رسالة ترحيب منسقة.
الحل:
# --- برنامج قراءة ملف بيانات ---
# 1. فتح الملف للقراءة
with open("data.txt", "r", encoding="utf-8") as file:
# 2. قراءة السطر الأول والوحيد
data_line = file.read()
# 3. تقسيم السطر عند الفاصلة للحصول على قائمة من جزأين
data_parts = data_line.split(',')
# 4. إسناد كل جزء إلى متغير
name = data_parts[0]
city = data_parts[1]
# 5. طباعة الرسالة المنسقة
print(f"أهلاً بك {name} من مدينة {city}!")
شرح الحل:
بعد قراءة السطر، نستخدم دالة النصوص .split(',')
التي تقسم النص عند كل فاصلة وتعيد قائمة. في هذه الحالة، data_parts
ستكون قائمة مثل ['أحمد', 'الرياض']
. بعد ذلك، نصل إلى كل جزء باستخدام الفهرسة (data_parts[0]
و data_parts[1]
).
التمرين 9: حفظ درجات الطالب
المطلوب:
لديك قاموس يمثل درجات طالب في مواد مختلفة. اكتب برنامجًا يحفظ هذا القاموس في ملف report_card.txt
، بحيث يكون كل سطر في الملف على شكل المادة: الدرجة
.
الحل:
# --- برنامج حفظ الدرجات ---
# 1. القاموس المراد حفظه
grades = {
"الرياضيات": 90,
"العلوم": 88,
"التاريخ": 95
}
# 2. فتح الملف للكتابة
with open("report_card.txt", "w", encoding="utf-8") as file:
file.write("--- تقرير الدرجات ---\n")
# 3. المرور على كل زوج (مادة، درجة) في القاموس
for subject, grade in grades.items():
# 4. كتابة السطر بالصيغة المطلوبة
file.write(f"{subject}: {grade}\n")
print("تم حفظ تقرير الدرجات بنجاح.")
شرح الحل:
نستخدم دالة .items()
للمرور على القاموس والحصول على المفتاح (subject
) والقيمة (grade
) في كل دورة. داخل الحلقة، نستخدم f-string
لتنسيق النص بالشكل المطلوب (المادة: الدرجة
) ونضيف \n
لضمان أن كل مادة تأتي على سطر منفصل.
التمرين 10: تحميل درجات الطالب
المطلوب:
اكتب برنامجًا يقرأ ملف report_card.txt
(من التمرين السابق)، ويتجاهل السطر الأول، ثم يقوم بإعادة بناء قاموس الدرجات في بايثون، ويطبعه في النهاية.
الحل:
# --- برنامج تحميل الدرجات ---
# 1. إنشاء قاموس فارغ لتخزين البيانات
loaded_grades = {}
# 2. فتح الملف للقراءة
with open("report_card.txt", "r", encoding="utf-8") as file:
# 3. قراءة كل الأسطر في قائمة
lines = file.readlines()
# 4. المرور على القائمة بداية من العنصر الثاني (لتجاهل العنوان)
# نستخدم الاقتطاع [1:] للبدء من الفهرس 1
for line in lines[1:]:
# 5. تقسيم السطر عند ':'
parts = line.strip().split(': ')
# التأكد من أن السطر يحتوي على جزأين
if len(parts) == 2:
subject = parts[0]
grade = int(parts[1]) # تحويل الدرجة إلى رقم صحيح
# 6. إضافة الزوج إلى القاموس
loaded_grades[subject] = grade
print("تم تحميل الدرجات بنجاح:")
print(loaded_grades)
شرح الحل:
نقرأ كل الأسطر أولاً باستخدام .readlines()
للحصول على قائمة. ثم نستخدم الاقتطاع lines[1:]
لبدء الحلقة من السطر الثاني وتجاهل العنوان. في كل دورة، نقسم السطر عند ': '
للحصول على المادة والدرجة. من المهم تحويل الدرجة من نص إلى رقم باستخدام int()
قبل إضافتها إلى القاموس الجديد loaded_grades
.
ماذا بعد؟
لقد رأينا أن أخطاء مثل FileNotFoundError
يمكن أن تحدث. في الفصل التاسع، سنتعلم كيفية معالجة الأخطاء والاستثناءات (Exception Handling) بشكل احترافي لجعل برامجنا أكثر قوة وقدرة على مواجهة المشاكل دون أن تتوقف عن العمل.