تخطَّ إلى المحتوى

التعامل مع الملفات في Python: القراءة والكتابة

الدرس 17 من 25 · Python

كل البرامج التي كتبتها حتى الآن تنسى كل شيء عند إغلاقها: المتغيرات تعيش في ذاكرة الكمبيوتر المؤقتة، وتختفي بانتهاء البرنامج. في هذا الدرس ستتعلم كيف تحفظ البيانات في ملف (File) على القرص، فتبقى موجودة بعد إغلاق البرنامج، وتقرؤها متى أردت.

تخيّل الملف مثل دفتر في درج مكتبك: تفتحه أولاً، ثم تكتب فيه أو تقرأ منه، ثم تغلقه. في Python نفتح الملف بالدالة open، ونعطيها اسم الملف ووضع الفتح (Mode):

with open("notes.txt", "w", encoding="utf-8") as file:
file.write("اشترِ الخبز\n")
file.write("ذاكر درس Python\n")
print("تم الحفظ")
الناتج
تم الحفظ

بعد تشغيل الكود ستجد ملفاً جديداً اسمه notes.txt بجانب ملف برنامجك، وفيه سطران. لنفهم ما كتبناه:

  • "w" اختصار write، أي الكتابة. إذا لم يكن الملف موجوداً فستنشئه Python.
  • encoding="utf-8" يحدد الترميز (Encoding)، أي طريقة تحويل الحروف إلى بيانات. الترميز utf-8 يدعم العربية وكل اللغات.
  • as file يعطي الملف المفتوح اسماً نستخدمه داخل البلوك.
  • file.write تكتب النص كما هو، ولا تضيف سطراً جديداً مثل print، لذلك كتبنا \n في آخر كل سطر.

للقراءة نستخدم الوضع "r" (اختصار read). والدالة read تعيد محتوى الملف كله في نص واحد:

with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
الناتج
اشترِ الخبز
ذاكر درس Python

الوضع "r" هو الوضع الافتراضي، فيمكنك حذفه وكتابة open("notes.txt", encoding="utf-8") فقط.

غالباً تريد التعامل مع كل سطر وحده. الملف المفتوح يمكن المرور عليه بحلقة for مباشرة، وفي كل دورة تحصل على سطر:

with open("notes.txt", encoding="utf-8") as file:
for line in file:
print("-", line.strip())
الناتج
- اشترِ الخبز
- ذاكر درس Python

كل سطر تقرؤه ينتهي بالرمز \n الذي كتبناه، ولذلك استخدمنا strip() لحذفه. بدونها سيظهر سطر فارغ بعد كل سطر.

انتبه: الوضع "w" يمسح محتوى الملف القديم ويبدأ من الصفر. إذا أردت أن تضيف في آخر الملف دون مسح ما فيه، استخدم الوضع "a" (اختصار append):

with open("notes.txt", "a", encoding="utf-8") as file:
file.write("اتصل بجدتك\n")
with open("notes.txt", encoding="utf-8") as file:
lines = file.readlines()
print(len(lines))
print(lines[2].strip())
الناتج
3
اتصل بجدتك

الدالة readlines تعيد قائمة فيها كل سطور الملف، فتستطيع عدّها أو الوصول لسطر معيّن بفهرسه.

الوضع المعنى إذا كان الملف موجوداً إذا لم يكن موجوداً
"r" قراءة يقرؤه خطأ FileNotFoundError
"w" كتابة يمسح محتواه ينشئه
"a" إضافة يكتب في آخره ينشئه

ماذا لو لم يكن الملف موجوداً؟

Section titled “ماذا لو لم يكن الملف موجوداً؟”

إذا حاولت قراءة ملف غير موجود فستتوقف Python بخطأ FileNotFoundError. وقد تعلمت في الدرس السابق كيف تلتقط الأخطاء:

try:
with open("missing.txt", encoding="utf-8") as file:
print(file.read())
except FileNotFoundError:
print("الملف غير موجود")
الناتج
الملف غير موجود

هذا النمط مهم جداً: في أول تشغيل لبرنامجك لن يكون ملف البيانات موجوداً بعد، فلا يصح أن ينهار البرنامج بسبب ذلك.

الملف النصي يخزّن نصوصاً فقط. فإذا أردت حفظ أرقام، حوّلها إلى نص عند الكتابة بـ str، وأعدها أرقاماً عند القراءة بـ int:

scores = [90, 75, 88]
with open("scores.txt", "w", encoding="utf-8") as file:
for score in scores:
file.write(str(score) + "\n")
total = 0
with open("scores.txt", encoding="utf-8") as file:
for line in file:
total += int(line)
print("المجموع:", total)
الناتج
المجموع: 253

اكتب برنامج «دفتر يوميات»: يطلب من المستخدم جملة بـ input، ويضيفها في آخر ملف diary.txt، ثم يعرض كل ما في الملف مع رقم كل سطر. شغّله ثلاث مرات، وستجد أن الجمل القديمة ما زالت محفوظة:

الناتج
ماذا حدث اليوم؟ تعلمت الملفات
1. ذهبت إلى المدرسة
2. لعبت كرة القدم
3. تعلمت الملفات
  • استخدام "w" وأنت تقصد الإضافة: ستفقد كل المحتوى القديم دون أي تحذير. استخدم "a" للإضافة.
  • نسيان encoding="utf-8": على ويندوز قد تظهر الحروف العربية رموزاً غريبة، أو يتوقف البرنامج بخطأ UnicodeEncodeError. اكتب الترميز دائماً.
  • نسيان \n عند الكتابة: ستلتصق كل الجمل في سطر واحد طويل.
  • كتابة رقم مباشرة: file.write(90) تسبب TypeError. حوّله أولاً بـ str(90).

سؤال

ماذا يحدث عند فتح ملف موجود بالوضع 'w'؟

سؤال

ما فائدة with عند فتح الملفات؟

  • open(اسم, وضع, encoding="utf-8") تفتح الملف، و with تغلقه تلقائياً.
  • "w" تكتب من الصفر، و "a" تضيف في الآخر، و "r" تقرأ.
  • read() تعيد الملف كله، وحلقة for تمر على سطوره، و readlines() تعيدها قائمة.
  • الملف يخزّن نصوصاً، فحوّل الأرقام بـ str و int.
  • التقط FileNotFoundError عند قراءة ملف قد لا يكون موجوداً.