AzLearn

قراءة وكتابة الملفات

File I/O

تطبيق ~25 دقيقة

قراءة وكتابة الملفات — File I/O

التعامل مع الملفات مهارة لا غنى عنها — سواء كنت تقرأ إعدادات من ملف، تعالج بيانات CSV، أو تخزن نتائج JSON. Python تجعل هذا سهلاً وآمناً بكلمة واحدة: with.

ملاحظة عن البيئة التفاعلية: المتصفح لا يملك نظام ملفات حقيقياً، لذا نستخدم io.StringIO لمحاكاة الملفات. StringIO يتصرف تماماً مثل ملف حقيقي — نفس الدوال، نفس الأوضاع، نفس السلوك. الأنماط التي ستتعلمها هنا تنتقل 1:1 إلى جهازك الحقيقي، والفرق الوحيد هو أنك ستستبدل StringIO(data) بـ open("filename.txt").


open() — الأساس

الدالة open() تفتح ملفاً وتُرجع كائن ملف (file object). أهم معاملاتها:

file = open("data.txt", "r", encoding="utf-8")
#             اسم الملف   الوضع    الترميز

أوضاع الفتح:

الوضعالمعنىيُنشئ الملف؟
"r"قراءة فقط (افتراضي)لا — يفشل إذا لم يوجد
"w"كتابة — يمسح المحتوى القديمنعم
"a"إلحاق — يُضيف للنهايةنعم
"r+"قراءة وكتابةلا
"rb" / "wb"binary — للصور والملفات الثنائية

القاعدة الذهبية: دائماً أغلق الملف بعد الانتهاء. الطريقة الصحيحة هي with:

# طريقة خاطئة — Wrong way (may leak file handle)
file = open("data.txt")
content = file.read()
file.close()  # قد لا تُنفَّذ إذا حدث خطأ

# الطريقة الصحيحة — Correct way
with open("data.txt", encoding="utf-8") as file:
    content = file.read()
# الملف مُغلق تلقائياً هنا حتى لو حدث خطأ

with هو مدير السياق (context manager) — يضمن تنفيذ الإغلاق دائماً، حتى عند الاستثناءات.


قراءة الملفات

ثلاث طرق لقراءة ملف:

with open("file.txt") as f:
    content = f.read()        # كل المحتوى كنص واحد
    lines = f.readlines()     # قائمة بالأسطر (تحتفظ بـ \n)
    line = f.readline()       # سطر واحد فقط

في المتصفح نستخدم StringIO بدلاً من مسار الملف:

main.go

للقراءة سطراً بسطر بكفاءة — مفيد مع الملفات الكبيرة:

main.go

كتابة الملفات

في جهازك الحقيقي تكتب هكذا:

# كتابة — Write (يمسح المحتوى القديم)
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("السطر الأول\n")
    f.write("السطر الثاني\n")

# إلحاق — Append (يُضيف للنهاية)
with open("output.txt", "a", encoding="utf-8") as f:
    f.write("سطر مُلحق\n")

لمحاكاة الكتابة في المتصفح، نستخدم StringIO كـ buffer:

main.go

csv — ملفات البيانات المنظّمة

CSV (Comma-Separated Values) هو أشهر صيغة لتبادل البيانات. Python لها مكتبة csv مدمجة تتعامل مع الحالات الصعبة (القيم التي تحتوي فواصل، علامات الاقتباس، الخطوط الجديدة).

csv.reader للقراءة البسيطة:

import csv

with open("students.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)  # قراءة العنوان — Read header
    for row in reader:
        print(row)  # كل صف قائمة — Each row is a list

csv.DictReader للقراءة بالأسماء (أوضح وأسهل):

import csv

with open("students.csv", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], row["score"])  # الوصول بالاسم — Access by name

مثال تفاعلي كامل مع StringIO:

main.go

csv.writer للكتابة:

main.go

json — تبادل البيانات الحديث

JSON (JavaScript Object Notation) هو الصيغة الأشهر لتبادل البيانات في الويب. Python تحوّل بين القواميس والـ JSON بدالتين فقط:

الدالةالاتجاهالمعنى
json.loads(string)نص → dictتحليل نص JSON
json.dumps(obj)dict → نصتحويل dict لـ JSON
json.load(file)ملف → dictقراءة JSON من ملف
json.dump(obj, file)dict → ملفكتابة JSON لملف
main.go

ensure_ascii=False ضروري للعربية — بدونه تُكتب الحروف كـ \u0623\u062D\u0645\u062F بدلاً من أحمد.


مثال متكامل: معالج بيانات

هذا المثال يجمع CSV و JSON في سير عمل واحد — يقرأ بيانات CSV ثم يُصدرها كـ JSON:

main.go

التحديات — Challenges

تحدي 1: قراءة الأسطر

اكتب كوداً يقرأ النص التالي من StringIO ويطبع عدد الأسطر فيه. المتوقع: 3.

تحدي — Challenge

تحدي 2: تحليل CSV

اقرأ بيانات CSV التالية وأطبع مجموع العلامات. المتوقع: 270.

تحدي — Challenge

تحدي 3: تحليل JSON

حلّل النص JSON التالي وأطبع عدد المهارات (skills). المتوقع: 3.

تحدي — Challenge

تحدي 4: كتابة JSON

حوّل القاموس التالي إلى نص JSON مع دعم العربية (ensure_ascii=False) وأطبعه. المتوقع: {"مدينة": "الرياض", "سكان": 7500000}.

تحدي — Challenge

تحدي 5: CSV إلى JSON

اقرأ بيانات CSV وحوّلها لقائمة قواميس ثم أطبع عدد العناصر. المتوقع: 2.

تحدي — Challenge