Kodokon kodokon.com

الملفات والوحدات: with، import، التنظيم

اقرأ الملفات واكتبها بنظافة باستخدام with، وتبادل بيانات JSON، ونظّم شيفرتك في وحدات قابلة للاستيراد.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

قراءة الملفات وكتابتها هما الخبز اليومي لأيّ برنامج حقيقي: التصديرات، والسجلات، والإعدادات. تفتح الكلمة المفتاحية with الملف وتضمن إغلاقه، حتى لو حدث خطأ في منتصف الكتلة. إنها الطريقة الاحترافية الوحيدة لفتح ملف: فمن دونها، قد يُفسد close() منسيّ البيانات أو يستنزف موارد النظام.

PYTHON
lines = ["alpha", "beta", "gamma"]

with open("notes.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("notes.txt", encoding="utf-8") as f:
    content = f.read()

print(content)
يكتب النمط 'w' مع استبدال المحتوى؛ ومن دون نمط، تكون في وضع القراءة.

بالنسبة إلى البيانات المهيكلة، لا تخترع صيغتك الخاصة: تحوّل الوحدة json من المكتبة القياسية القواميس والقوائم إلى نص، والعكس. إنها صيغة التبادل العالمية بين البرامج وواجهات API وملفات الإعدادات.

PYTHON
import json

config = {"debug": True, "retries": 3}

with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, indent=2)

with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["retries"])  # 3
تكتب json.dump البنية، وتعيد json.load بناءها.

إن الوحدة ليست إلا ملف .py: يحمّل import billing الملف billing.py وينفّذ محتواه مرة واحدة فقط. نظّم شيفرتك بحسب المسؤولية - وحدة للفوترة، وأخرى للتخزين - واحتفظ بتعليمات import في أعلى الملف. ويميّز الاختبار if __name__ == "__main__" بين حالتين: عند التشغيل المباشر، ينفّذ الملف هذه الكتلة؛ وعند الاستيراد، يتجاهلها.

PYTHON
def compute_total(prices):
    return round(sum(prices), 2)

def main():
    print(compute_total([9.99, 4.5, 20.0]))

if __name__ == "__main__":
    main()
محتوى billing.py: قابل للاستيراد في أيّ مكان، وقابل للتشغيل مباشرة.
BASH
python billing.py
بهذه الطريقة ينفّذ الملف الدالة main()؛ أما إذا استُورد، فلا يفعل شيئًا.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما الميزة الأساسية لـ with open(...) مقارنةً بـ open() وحدها؟
    • يُغلق الملف تلقائيًا، حتى في حالة حدوث خطأ
    • قراءة الملف أسرع
    • يُنشأ الملف إن لم يكن موجودًا، مهما كان النمط
  2. ما الفرق بين النمطين "w" و"a"؟
    • "w" يستبدل المحتوى الموجود، و"a" يضيف في النهاية
    • "w" يكتب نصًا، و"a" يكتب بيانات ثنائية
    • "w" ينشئ الملف، و"a" يفشل إن لم يكن موجودًا
  3. ما فائدة الاختبار if __name__ == "__main__"؟
    • التحقق من أن اسم الملف هو فعلًا main.py
    • تنفيذ كتلة فقط عندما يُشغَّل الملف مباشرة
    • منع الملفات الأخرى من استيراد الوحدة