التعامل مع الملفات (File Handling)
البيانات التي في الذاكرة (RAM) تختفي بمجرد إغلاق البرنامج. لكي نحتفظ بالبيانات بشكل دائم، نحتاج لتخزينها في ملفات على القرص الصلب. بايثون توفر أدوات قوية وسهلة جداً للتعامل مع الملفات: قراءتها، الكتابة فيها، وتعديلها.
1. فتح الملفات (open)
نستخدم دالة open() لفتح ملف. تأخذ الدالة اسم الملف والوضع (Mode) الذي نريد فتح الملف به.
| الوضع (Mode) | الوصف |
|---|---|
'r' |
Read (قراءة): الافتراضي. يفتح الملف للقراءة فقط. يعطي خطأ إذا لم يكن الملف موجوداً. |
'w' |
Write (كتابة): يفتح الملف للكتابة. ينشئ الملف إذا لم يكن موجوداً، ويمسح محتواه إذا كان موجوداً. |
'a' |
Append (إضافة): يفتح الملف للإضافة في نهايته. ينشئ الملف إذا لم يكن موجوداً. |
'x' |
Create (إنشاء): ينشئ ملفاً جديداً، ويعطي خطأ إذا كان الملف موجوداً بالفعل. |
2. الطريقة القديمة vs الطريقة الحديثة (with)
with عند التعامل مع الملفات. هي تضمن إغلاق الملف تلقائياً حتى لو حدث خطأ، مما يمنع تلف البيانات واستهلاك الذاكرة.
# ❌ الطريقة القديمة (غير مستحسنة)
f = open("example.txt", "w")
f.write("Hello World")
f.close() # يجب أن تتذكر إغلاقه يدوياً!
# ✅ الطريقة الحديثة (Best Practice)
with open("example.txt", "w") as f:
f.write("Hello World")
# يتم إغلاق الملف تلقائياً هنا
3. الكتابة في الملفات
# الكتابة (تمسح المحتوى القديم)
with open("notes.txt", "w", encoding="utf-8") as file:
file.write("السطر الأول\n")
file.write("السطر الثاني\n")
# الإضافة (تحتفظ بالمحتوى القديم)
with open("notes.txt", "a", encoding="utf-8") as file:
file.write("هذا سطر جديد تمت إضافته\n")
4. قراءة الملفات
هناك عدة طرق لقراءة محتوى الملف:
with open("notes.txt", "r", encoding="utf-8") as file:
# 1. قراءة الملف كاملاً كنص واحد
content = file.read()
print("--- المحتوى كاملاً ---")
print(content)
with open("notes.txt", "r", encoding="utf-8") as file:
# 2. قراءة سطر بسطر (الأفضل للملفات الكبيرة)
print("\n--- سطر بسطر ---")
for line in file:
print(line.strip()) # strip لإزالة مسافة السطر الجديد الزائدة
with open("notes.txt", "r", encoding="utf-8") as file:
# 3. قراءة الأسطر وتخزينها في قائمة
lines = file.readlines()
print(f"\nعدد الأسطر: {len(lines)}")
5. تطبيق عملي: نظام تسجيل الملاحظات
import datetime
def add_note():
note = input("اكتب ملاحظتك: ")
date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
with open("diary.txt", "a", encoding="utf-8") as f:
f.write(f"[{date}] {note}\n")
print("✅ تم حفظ الملاحظة!")
def view_notes():
try:
with open("diary.txt", "r", encoding="utf-8") as f:
print("\n--- مذكراتي ---")
print(f.read())
print("---------------")
except FileNotFoundError:
print("📭 لا توجد ملاحظات بعد.")
while True:
choice = input("\n1. إضافة ملاحظة\n2. عرض الملاحظات\n3. خروج\nاختر: ")
if choice == '1':
add_note()
elif choice == '2':
view_notes()
elif choice == '3':
break
else:
print("خيار غير صحيح!")
6. أفضل الممارسات
- استخدم
with open(...)دائماً. - حدد الترميز
encoding="utf-8"لدعم اللغة العربية. - استخدم
try-exceptلمعالجة خطأ عدم وجود الملف.
- لا تستخدم المسارات المطلقة (Absolute Paths) إذا كنت ستنقل الكود.
- لا تفتح ملفاً للكتابة
'w'إلا إذا كنت متأكداً من رغبتك في مسح محتواه.
ملخص الدرس
'r'للقراءة،'w'للكتابة (مسح)،'a'للإضافة.withتضمن إغلاق الملف بأمان.read()تقرأ الكل،readlines()تقرأ كقائمة.
7. العمل مع ملفات JSON
JSON (JavaScript Object Notation) هو صيغة بسيطة وقياسية لتخزين البيانات المهيكلة. تُستخدم على نطاق واسع في تطبيقات الويب وقواعد البيانات.
import json
# كتابة بيانات في ملف JSON
users = [
{"name": "محمد", "age": 25, "city": "القاهرة"},
{"name": "فاطمة", "age": 23, "city": "الرياض"},
]
with open("users.json", "w", encoding="utf-8") as file:
json.dump(users, file, ensure_ascii=False, indent=4)
# قراءة بيانات من ملف JSON
with open("users.json", "r", encoding="utf-8") as file:
data = json.load(file)
for user in data:
print(f"{user['name']} - {user['age']} سنة")
ensure_ascii=False عند التعامل مع النصوص العربية، وindent=4 لتنسيق البيانات بشكل واضح.
8. العمل مع ملفات CSV
CSV (Comma-Separated Values) تُستخدم لتخزين الجداول والبيانات المنظمة في صفوف وأعمدة. مفيدة جداً للعمل مع البيانات الإحصائية والجداول البيانية.
import csv
# كتابة بيانات في ملف CSV
students = [
["الاسم", "الرياضيات", "العربية", "الإنجليزية"],
["أحمد", 90, 85, 88],
["سارة", 95, 92, 90],
["علي", 78, 82, 80],
]
with open("students.csv", "w", newline='', encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(students)
# قراءة بيانات من ملف CSV
with open("students.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
for row in reader:
print(" | ".join(row))
قراءة CSV كقواميس (DictReader)
الطريقة الأفضل للعمل مع CSV هي استخدام DictReader لأنها تحول كل صف إلى قاموس:
import csv
with open("students.csv", "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
for row in reader:
print(f"{row['الاسم']}: رياضيات {row['الرياضيات']}")
9. معالجة الأخطاء في الملفات
عند التعامل مع الملفات، قد تحدث أخطاء عديدة. استخدم try-except لمعالجتها:
import os
def safe_read_file(filename):
try:
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
return content
except FileNotFoundError:
print(f"❌ الملف '{filename}' غير موجود!")
return None
except PermissionError:
print(f"❌ ليس لديك صلاحية للوصول إلى '{filename}'")
return None
except Exception as e:
print(f"❌ حدث خطأ: {e}")
return None
# فحص وجود الملف قبل فتحه
if os.path.exists("data.txt"):
content = safe_read_file("data.txt")
else:
print("الملف غير موجود")
الخطوة التالية
بعد أن تعلمت كيفية التعامل مع الملفات، حان الوقت لفهم كيف تدير بايثون هذه البيانات في الذاكرة وكيف تتعامل مع المراجع.
الدرس التالي: فهم الذاكرة في Python (Memory Understanding)