التعامل مع الملفات (File Handling)

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

1. فتح الملفات (open)

نستخدم دالة open() لفتح ملف. تأخذ الدالة اسم الملف والوضع (Mode) الذي نريد فتح الملف به.

الوضع (Mode) الوصف
'r' Read (قراءة): الافتراضي. يفتح الملف للقراءة فقط. يعطي خطأ إذا لم يكن الملف موجوداً.
'w' Write (كتابة): يفتح الملف للكتابة. ينشئ الملف إذا لم يكن موجوداً، ويمسح محتواه إذا كان موجوداً.
'a' Append (إضافة): يفتح الملف للإضافة في نهايته. ينشئ الملف إذا لم يكن موجوداً.
'x' Create (إنشاء): ينشئ ملفاً جديداً، ويعطي خطأ إذا كان الملف موجوداً بالفعل.

2. الطريقة القديمة vs الطريقة الحديثة (with)

نصيحة احترافية: استخدم دائماً with عند التعامل مع الملفات. هي تضمن إغلاق الملف تلقائياً حتى لو حدث خطأ، مما يمنع تلف البيانات واستهلاك الذاكرة.
open_file.py
# ❌ الطريقة القديمة (غير مستحسنة)
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. الكتابة في الملفات

write_files.py
# الكتابة (تمسح المحتوى القديم)
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. قراءة الملفات

هناك عدة طرق لقراءة محتوى الملف:

read_files.py
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. تطبيق عملي: نظام تسجيل الملاحظات

diary_app.py
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) هو صيغة بسيطة وقياسية لتخزين البيانات المهيكلة. تُستخدم على نطاق واسع في تطبيقات الويب وقواعد البيانات.

json_handling.py
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']} سنة")
النتيجة
محمد - 25 سنة فاطمة - 23 سنة
نصيحة: استخدم ensure_ascii=False عند التعامل مع النصوص العربية، وindent=4 لتنسيق البيانات بشكل واضح.

8. العمل مع ملفات CSV

CSV (Comma-Separated Values) تُستخدم لتخزين الجداول والبيانات المنظمة في صفوف وأعمدة. مفيدة جداً للعمل مع البيانات الإحصائية والجداول البيانية.

csv_handling.py
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))
النتيجة
الاسم | الرياضيات | العربية | الإنجليزية أحمد | 90 | 85 | 88 سارة | 95 | 92 | 90 علي | 78 | 82 | 80
قراءة CSV كقواميس (DictReader)

الطريقة الأفضل للعمل مع CSV هي استخدام DictReader لأنها تحول كل صف إلى قاموس:

csv_dictreader.py
import csv

with open("students.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(f"{row['الاسم']}: رياضيات {row['الرياضيات']}")
النتيجة
أحمد: رياضيات 90 سارة: رياضيات 95 علي: رياضيات 78

9. معالجة الأخطاء في الملفات

عند التعامل مع الملفات، قد تحدث أخطاء عديدة. استخدم try-except لمعالجتها:

safe_file_handling.py
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)
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن