محتويات الدورة

بايثون / الأساسيات / الدرس 6

الملفات والبيانات المهيكلة

اقرأ النصوص واكتبها عن قصد، وأدر الموارد، وافصل تنسيق التخزين عن التحقق من المحتوى.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • المسارات قيم
  • الفشل جزء من حد التخزين

المسارات قيم

يحدد المسار مكانا ولا يمثل محتوى الملف. توفر pathlib.Path عمليات لضم الأسماء والقراءة والكتابة دون تركيب فواصل الأنظمة يدويا. يفسر المسار النسبي انطلاقا من مجلد العمل الحالي للعملية، وقد يختلف عن مجلد الملف البرمجي. سجل الفرق عند تعذر العثور على ملف. قد تساعد المسارات المطلقة في التشخيص، لكنها لا تصلح افتراضا ثابتا عن أجهزة الآخرين. تستخدم الأمثلة TemporaryDirectory لعزل الملفات المنشأة داخل مجلد مؤقت ينظف تلقائيا عند انتهاء المثال.

الوضع النصي وعمر المورد

يفتح الملف موردا من نظام التشغيل. توضح with ملكية المورد وتغلق الملف عند الخروج حتى مع انتشار استثناء. حدد encoding="utf-8" للنص الذي تتحكم فيه بدلا من افتراض إعداد الجهاز. يتطلب وضع القراءة ملفا موجودا، ويستبدل وضع الكتابة المحتوى، ويضيف وضع الإلحاق في النهاية. اختر قبل التنفيذ. تقلل القراءة سطرا بسطر مقدار البيانات الموجودة في الذاكرة، بينما تناسب read_text وثيقة صغيرة معروفة. لا يتحقق أي الأسلوبين وحده من بنية المحتوى أو حجمه المسموح.

كتابة ملف نصي صغير وقراءته

يمتلك المثال المجلد المؤقت ويحدد الترميز عند الكتابة والقراءة. تفصل splitlines الأسطر المنطقية دون الاحتفاظ بعلامات نهايتها. يناسب ذلك العرض أو السجلات البسيطة، لكنه لا يعوض محلل التنسيق إذا احتوت الحقول نفسها أسطرا جديدة. التحويل واضح: يحفظ الملف سطرين ويجمعهما التقرير بفاصل. لا تعتمد النتيجة على اسم المجلد المؤقت العشوائي لأن المثال يطبع المحتوى وحده، ولا يعدل ملفات المتعلم الموجودة.

python كتابة ملف نصي صغير وقراءته — مثال محلول
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("first\nsecond\n", encoding="utf-8")
    lines = path.read_text(encoding="utf-8").splitlines()
    print(" | ".join(lines))
الناتج المتوقع
first | second

يتولى سياق المجلد التنظيف. يتفق الطرفان على UTF-8 وتزيل splitlines فواصل الأسطر قبل جمع المحتوى.

JSON تنسيق وليس مخطط تحقق

يمثل JSON كائنات ومصفوفات ونصوصا وأعدادا وقيما منطقية وnull. تحول json.dumps بيانات بايثون المتوافقة إلى نص، وتحلل json.loads النص إلى قيم. مفاتيح كائن JSON نصية؛ لذلك قد لا يعود قاموس بمفاتيح غير نصية كما كان. لا تصبح البيانات المحللة طلبا أو إعدادا صالحا تلقائيا. تحقق من نوع الحاوية والحقول المطلوبة والقيم المسموحة وحدود الحجم. يوضح المثال دورة تحويل لكائن ذي اسم يونيكود. تحسن ensure_ascii=False قابلية قراءة المحارف دون تغيير المعنى.

python JSON تنسيق وليس مخطط تحقق — مثال محلول
import json

record = {"label": "قلم", "quantity": 3}
text = json.dumps(record, ensure_ascii=False)
loaded = json.loads(text)
print(loaded["label"])
print(loaded["quantity"] * 2)
الناتج المتوقع
قلم
6

يبقى الاسم العربي بعد التحويل والتحليل، وتبقى الكمية عددا صحيحا يمكن استخدامه في الحساب.

الفشل جزء من حد التخزين

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

الأخطاء الشائعة وإصلاحها

ظهور FileNotFoundError رغم وجود الملف قرب البرنامج

لماذا يحدث؟
يفسر المسار النسبي من مجلد عمل مختلف.
كيف تصلحه؟
افحص مجلد العمل ومرر مسارا أساسيا مقصودا.
كيف تتجنب تكراره؟
اجعل مواقع البيانات إعدادات صريحة.

ظهور UnicodeDecodeError أثناء القراءة

لماذا يحدث؟
لا يتوافق الترميز المختار مع ترميز الملف الحقيقي.
كيف تصلحه؟
استخدم الترميز المحدد من منتج الملف وارفض التلف بوضوح.
كيف تتجنب تكراره؟
وثق الترميز عند كل حد لتخزين النص.

محو تقرير محفوظ لمحتوى سابق

لماذا يحدث؟
يستبدل وضع الكتابة المحتوى في المسار المحدد.
كيف تصلحه؟
اختر وجهة معزولة وحدد الاستبدال أو الإلحاق عن قصد.
كيف تتجنب تكراره؟
راجع المسار ووضع الكتابة قبل التنفيذ.

اختبر فهمك

1. صمم التحقق بعد تحميل {"quantity": "3"} من JSON.

اعرض الحل المشروح

ينجح التحليل، لكن quantity نص وليست العدد المطلوب. تحقق من أن المستوى الأعلى كائن، ومن وجود الحقل ونوعه ثم مجاله غير السالب. قرر صراحة هل تسمح بالتحويل من نص؛ فنجاح تحليل JSON لا يثبت صلاحية سجل المجال.

2. اشرح عد أسطر ملف UTF-8 كبير دون تحميله كاملا.

اعرض الحل المشروح

افتح المسار باستخدام with وencoding="utf-8"، وهيئ عدادا وزده خلال المرور على الملف. تعطي كل دورة سطرا، فلا تحتاج إلى كامل المحتوى دفعة واحدة. وثق أن العد يشمل السطر الأخير ولو لم ينته بعلامة سطر جديد.

أهم ما تعلمته

  • أدر عمر الملف بمدير سياق.
  • حدد الترميز وسياسة الكتابة عن قصد.
  • التحليل والتحقق من المجال مسؤوليتان منفصلتان.

المراجع الرسمية