التعامل مع الملفات في بايثون
مقدمة: لماذا نحتاج التعامل مع الملفات؟
الفصل السابع: التعامل مع الملفات في بايثون – لماذا نحتاج إلى قراءة وكتابة الملفات؟
مرحباً بك في الدرس السابع من سلسلة تعلم بايثون من الصفر حتى بناء API عملي باستخدام FastAPI. في الدروس السابقة، تعلمنا كيفية التعامل مع البيانات داخل البرنامج باستخدام المتغيرات والقوائم والقواميس. لكن ماذا يحدث عندما نغلق البرنامج؟ تختفي كل البيانات! هنا يأتي دور التعامل مع الملفات. في هذا الدرس، سنتعلم كيف نجعل بياناتنا دائمة عن طريق حفظها في ملفات على القرص الصلب، وكيف نقرأها مرة أخرى.
لماذا نحتاج إلى التعامل مع الملفات؟
تخيل أنك تبني تطبيقاً لإدارة المهام (وهو مشروعنا النهائي). إذا أغلقت التطبيق، يجب أن تظل المهام محفوظة حتى تعود إليها لاحقاً. بدون التعامل مع الملفات، ستفقد كل شيء. استخدام الملفات يسمح لنا بـ:
- حفظ البيانات بشكل دائم: مثل حفظ إعدادات المستخدم أو قائمة المهام.
- مشاركة البيانات بين البرامج: يمكن لبرنامج بايثون قراءة ملف أنشأه برنامج آخر.
- معالجة كميات كبيرة من البيانات: مثل قراءة ملف سجلات (log) أو بيانات من قاعدة بيانات نصية.
خطوات التعامل مع الملفات في بايثون
العملية بسيطة جداً وتتكون من ثلاث خطوات رئيسية:
- فتح الملف: باستخدام الدالة
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
أخطاء شائعة وكيفية تجنبها
- خطأ FileNotFoundError: يحدث عندما تحاول قراءة ملف غير موجود. الحل: تأكد من وجود الملف أو استخدم
try/except(سنشرحه في الدرس القادم). - نسيان encoding: يؤدي إلى أخطاء في قراءة النصوص العربية. الحل: استخدم دائماً
encoding='utf-8'. - الكتابة في وضع 'r': لا يمكنك الكتابة في وضع القراءة. تأكد من استخدام الوضع الصحيح.
- عدم إغلاق الملف: إذا لم تستخدم
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 عند التعامل مع النصوص العربية.
تمرين صغير
حاول كتابة برنامج يقوم بما يلي:
- يطلب من المستخدم إدخال 3 أسماء لأشخاص (استخدم
input()). - يحفظ هذه الأسماء في ملف اسمه
students.txt، كل اسم في سطر منفصل. - يقرأ الملف ويعرض الأسماء التي تم حفظها.
تأكد من استخدام وضع 'a' إذا كنت تريد إضافة أسماء جديدة في كل مرة تشغل فيها البرنامج، أو 'w' إذا كنت تريد البدء من جديد في كل مرة. جرب كلا الخيارين!
في الدرس القادم، سنتعلم كيفية التعامل مع الأخطاء والاستثناءات، وهو ما سيجعل برامجنا أكثر قوة واحترافية. استعد!
جاري تحميل التقييمات...