Kodax

التعامل مع الملفات — هياكل البيانات

التعامل مع الملفات

البيانات في المتغيرات تختفي عند انتهاء البرنامج. الملفات تتيح حفظ البيانات وقراءتها لاحقاً، والتعامل مع بيانات من مصادر أخرى (سجلات، تقارير، إعدادات).

فتح الملف بـ with

with open("notes.txt", "w", encoding="utf-8") as f:
    f.write("السطر الأول\n")

- with تغلق الملف تلقائياً عند انتهاء الكتلة، حتى لو حدث خطأ. لا تستخدم open بدونها في الحالات العادية.

- encoding="utf-8" ضرورية مع النصوص العربية: بدونها يستخدم نظام التشغيل ترميزه الافتراضي (في Windows قد يفشل الحفظ بـ UnicodeEncodeError أو تظهر الأحرف مشوهة).

أوضاع الفتح

| الوضع | المعنى | إذا كان الملف موجوداً | إذا لم يكن موجوداً |

|---|---|---|---|

| "r" | قراءة (الافتراضي) | يقرأ | FileNotFoundError |

| "w" | كتابة | يمسح المحتوى | ينشئه |

| "a" | إضافة للنهاية | يضيف | ينشئه |

| "x" | إنشاء فقط | FileExistsError | ينشئه |

أضف b للملفات الثنائية (صور): "rb".

طرق القراءة

with open("notes.txt", encoding="utf-8") as f:
    text = f.read()          # كل المحتوى كنص واحد

with open("notes.txt", encoding="utf-8") as f:
    for line in f:           # سطراً سطراً (الأفضل للملفات الكبيرة)
        print(line.rstrip("\n"))

كل سطر يُقرأ ومعه \n في نهايته؛ استخدم rstrip("\n") أو strip().

الكتابة

write لا تضيف سطراً جديداً تلقائياً؛ أضف \n بنفسك. و print(..., file=f) بديل مريح.

المسارات مع pathlib

from pathlib import Path
p = Path("data") / "report.txt"   # يعمل على كل أنظمة التشغيل
p.parent.mkdir(exist_ok=True)
p.write_text("مرحباً", encoding="utf-8")
print(p.read_text(encoding="utf-8"), p.exists(), p.suffix)

الأخطاء المتوقعة

قراءة ملف غير موجود ترمي FileNotFoundError؛ تعامل معها بـ try/except كما تعلمت في الدرس السابق.

تمرين

اكتب برنامجاً يضيف ملاحظة يكتبها المستخدم إلى ملف notes.txt (وضع الإضافة)، ثم يقرأ الملف ويطبع كل الملاحظات مرقمة.

from pathlib import Path

path = Path("notes.txt")

# كتابة (تمسح المحتوى السابق)
with open(path, "w", encoding="utf-8") as f:
    f.write("شراء الخبز\n")
    f.write("مراجعة درس Python\n")

# إضافة إلى النهاية
with open(path, "a", encoding="utf-8") as f:
    print("الاتصال بأحمد", file=f)

# القراءة سطراً سطراً مع الترقيم
with open(path, encoding="utf-8") as f:
    for number, line in enumerate(f, start=1):
        print(f"{number}. {line.rstrip()}")

# قراءة الكل دفعة واحدة
text = path.read_text(encoding="utf-8")
print("عدد الأسطر:", len(text.splitlines()))

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

# مجلدات ومسارات بشكل آمن على كل الأنظمة
report = Path("output") / "summary.txt"
report.parent.mkdir(exist_ok=True)
report.write_text("التقرير جاهز", encoding="utf-8")
print(report.exists(), report.suffix, report.name)

# تنظيف ملفات المثال
path.unlink()
report.unlink()
report.parent.rmdir()
اختبر فهمك