قراءة وكتابة الملفات
File I/O
قراءة وكتابة الملفات — 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 بدلاً من مسار الملف:
للقراءة سطراً بسطر بكفاءة — مفيد مع الملفات الكبيرة:
كتابة الملفات
في جهازك الحقيقي تكتب هكذا:
# كتابة — 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:
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:
csv.writer للكتابة:
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 لملف |
ensure_ascii=False ضروري للعربية — بدونه تُكتب الحروف كـ \u0623\u062D\u0645\u062F بدلاً من أحمد.
مثال متكامل: معالج بيانات
هذا المثال يجمع CSV و JSON في سير عمل واحد — يقرأ بيانات CSV ثم يُصدرها كـ JSON:
التحديات — Challenges
تحدي 1: قراءة الأسطر
اكتب كوداً يقرأ النص التالي من StringIO ويطبع عدد الأسطر فيه.
المتوقع: 3.
تحدي 2: تحليل CSV
اقرأ بيانات CSV التالية وأطبع مجموع العلامات. المتوقع: 270.
تحدي 3: تحليل JSON
حلّل النص JSON التالي وأطبع عدد المهارات (skills). المتوقع: 3.
تحدي 4: كتابة JSON
حوّل القاموس التالي إلى نص JSON مع دعم العربية (ensure_ascii=False) وأطبعه. المتوقع: {"مدينة": "الرياض", "سكان": 7500000}.
تحدي 5: CSV إلى JSON
اقرأ بيانات CSV وحوّلها لقائمة قواميس ثم أطبع عدد العناصر. المتوقع: 2.