مرحباً بك في الدرس السابع من سلسلة تعلم بايثون من الصفر حتى بناء API عملي باستخدام FastAPI. في الدروس السابقة، تعلمنا كيفية التعامل مع البيانات داخل البرنامج باستخدام المتغيرات والقوائم والقواميس. لكن ماذا يحدث عندما نغلق البرنامج؟ تختفي كل البيانات! هنا يأتي دور التعامل مع الملفات. في هذا الدرس، سنتعلم كيف نجعل بياناتنا دائمة عن طريق حفظها في ملفات على القرص الصلب، وكيف نقرأها مرة أخرى.
تخيل أنك تبني تطبيقاً لإدارة المهام (وهو مشروعنا النهائي). إذا أغلقت التطبيق، يجب أن تظل المهام محفوظة حتى تعود إليها لاحقاً. بدون التعامل مع الملفات، ستفقد كل شيء. استخدام الملفات يسمح لنا بـ:
العملية بسيطة جداً وتتكون من ثلاث خطوات رئيسية:
open().read() أو write().close().الطريقة الأفضل والأكثر أماناً هي استخدام جملة with التي تغلق الملف تلقائياً بعد الانتهاء، حتى لو حدث خطأ.
لنبدأ بمثال بسيط. سنكتب بعض النصوص إلى ملف اسمه my_notes.txt، ثم نقرأه مرة أخرى.
# 1. الكتابة إلى ملف
with open('my_notes.txt', 'w', encoding='utf-8') as file:
file.write("هذا هو أول سطر في ملفي.\n")
file.write("هذا هو السطر الثاني.\n")
file.write("بايثون لغة رائعة!\n")
print("تمت الكتابة بنجاح!")
# 2. القراءة من الملف
with open('my_notes.txt', 'r', encoding='utf-8') as file:
content = file.read()
print("محتوى الملف هو:")
print(content)
شرح الكود:
'w': وضع الكتابة (write). إذا كان الملف موجوداً، سيتم مسح محتواه القديم. إذا لم يكن موجوداً، سيتم إنشاؤه.'r': وضع القراءة (read). هذا هو الوضع الافتراضي.encoding='utf-8': مهم جداً للتعامل مع اللغة العربية والأحرف الخاصة.\n: رمز السطر الجديد (newline) لكتابة كل جملة في سطر منفصل.with open(...) بدلاً من file = open(...) ثم file.close(). جملة with تضمن إغلاق الملف تلقائياً، حتى لو حدث خطأ في منتصف العملية.
إليك أهم الأوضاع التي ستستخدمها:
'r': قراءة (read) – الملف يجب أن يكون موجوداً.'w': كتابة (write) – ينشئ ملفاً جديداً أو يمسح محتوى الملف القديم.'a': إضافة (append) – يضيف محتوى جديداً إلى نهاية الملف دون مسح القديم.'r+': قراءة وكتابة معاً.هناك عدة طرق لقراءة محتوى الملف، ولكل منها استخدامها:
file.read(): يقرأ الملف بأكمله كنص واحد (string).file.readline(): يقرأ سطراً واحداً فقط.file.readlines(): يقرأ جميع الأسطر ويعيدها كقائمة (list).# مثال على قراءة الأسطر كقائمة
with open('my_notes.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(f"السطر: {line.strip()}") # strip() لإزالة المسافات و \n
try/except (سنشرحه في الدرس القادم).encoding='utf-8'.with، قد يتلف الملف أو يستهلك ذاكرة. استخدم with دائماً.'w'، يتم مسح كل المحتوى القديم للملف فوراً. كن حذراً جداً عند استخدامه مع ملفات مهمة. إذا كنت تريد إضافة محتوى دون مسح القديم، استخدم وضع 'a' (append).
لنطبق ما تعلمناه على مشروعنا. سنقوم بحفظ قائمة مهام بسيطة في ملف، ثم قراءتها وعرضها.
# حفظ المهام في ملف
tasks = ["شراء حليب", "قراءة كتاب بايثون", "حل التمرين السابع"]
with open('tasks.txt', 'w', encoding='utf-8') as file:
for task in tasks:
file.write(task + '\n')
print("تم حفظ المهام!")
# قراءة المهام من الملف
print("المهام المحفوظة:")
with open('tasks.txt', 'r', encoding='utf-8') as file:
for line in file: # يمكن التكرار مباشرة على الملف
print(f"- {line.strip()}")
لاحظ أننا استخدمنا for line in file وهي طريقة فعالة لقراءة ملف سطراً سطراً دون تحميله بالكامل في الذاكرة، وهو أمر مفيد جداً للملفات الكبيرة.
في هذا الدرس، تعلمنا أساسيات التعامل مع الملفات في بايثون. هذه المهارة ضرورية لأي مشروع حقيقي، وخاصة مشروع API الخاص بنا حيث سنحتاج لحفظ البيانات بشكل دائم. تذكر دائماً استخدام جملة with وتحديد الترميز utf-8 عند التعامل مع النصوص العربية.
حاول كتابة برنامج يقوم بما يلي:
input()).students.txt، كل اسم في سطر منفصل.تأكد من استخدام وضع 'a' إذا كنت تريد إضافة أسماء جديدة في كل مرة تشغل فيها البرنامج، أو 'w' إذا كنت تريد البدء من جديد في كل مرة. جرب كلا الخيارين!
في الدرس القادم، سنتعلم كيفية التعامل مع الأخطاء والاستثناءات، وهو ما سيجعل برامجنا أكثر قوة واحترافية. استعد!
جاري تحميل التقييمات...