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

بايثون / برامج موثوقة / الدرس 12

السجلات الموثوقة وCSV والوقت

ابن خط معالجة سجلات بمخطط صريح ومعالجة صحيحة للتنسيق وتمثيل مفيد للوقت.

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

أهداف الدرس

  • فصل التنسيق عن المجال
  • ضبط الحجم وسياسة التقرير

فصل التنسيق عن المجال

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

CSV يحتاج إلى محلل

قد تتضمن CSV فواصل وعلامات اقتباس وأسطر جديدة داخل حقول مقتبسة. لا تعالج split(",") هذه القواعد. توفر csv.reader وcsv.DictReader سلوك الاقتباس وفق لهجة التنسيق وفواصله. عند فتح ملف حقيقي استخدم newline="" والترميز المتفق عليه. اشترط الأعمدة اللازمة وميز العمود الغائب عن الخلية الفارغة. حدد سياسة الرؤوس المتكررة والحقول الزائدة، ولا تدع بناء القاموس يقررها بصمت. توافق التنسيق عقد موثق بين المنتج والمستهلك.

تحليل سجل مقتبس بصورة صحيحة

يستخدم المثال StringIO ملفا نصيا في الذاكرة، فلا يحتاج إلى بيانات محلية. تربط DictReader الرؤوس بقيَم نصية، وتبقى الكمية نصا حتى تحولها int. يحتوي اسم المنتج فاصلة مقتبسة لكنه يظل حقلا واحدا، وهي حالة تفشل معها القسمة الساذجة. يضيف محلل فعلي رقم الصف والتحقق قبل التجميع. يبقى التحويل ظاهرا في هذا المثال كي تتضح الحدود بين تحليل التنسيق وتفسير العدد.

python تحليل سجل مقتبس بصورة صحيحة — مثال محلول
import csv
import io

data = 'name,quantity\n"Tea, green",3\nBread,2\n'
rows = csv.DictReader(io.StringIO(data, newline=""))
for row in rows:
    print(row["name"], int(row["quantity"]) * 2)
الناتج المتوقع
Tea, green 6
Bread 4

تظل الفاصلة داخل الاسم المقتبس جزءا من الحقل. يحدث التحويل العددي بعد التحليل وتضاعف كمية كل سجل توضيحي.

اللحظات والأوقات المحلية والمدد

قد تكون datetime غير واعية بالمنطقة الزمنية، أو واعية تحمل معلوماتها. قد تكون قراءة الساعة المحلية ملتبسة أو غير موجودة عند انتقال التوقيت الصيفي. تبادل اللحظات بمنطقة صريحة وتمثيل متفق عليه؛ وتتوفر timezone.utc في إصدارات المقرر. تمثل timedelta مدة، لكن طرح التواريخ أو اللحظات يحتاج إلى معنى واضح. ينشئ المثال لحظتين بتوقيت UTC ويحسب الدقائق دون افتراض إعداد الجهاز. تستخدم zoneinfo بيانات مناطق مسماة يعتمد توفرها على النظام أو حزمة بيانات مثبتة.

python اللحظات والأوقات المحلية والمدد — مثال محلول
from datetime import datetime, timezone

start = datetime(2026, 1, 1, 9, 0, tzinfo=timezone.utc)
end = datetime(2026, 1, 1, 10, 30, tzinfo=timezone.utc)
print(int((end - start).total_seconds() // 60))
print(start.isoformat())
الناتج المتوقع
90
2026-01-01T09:00:00+00:00

تستخدم اللحظتان الواعيتان UTC صراحة، فيبلغ الفرق تسعين دقيقة ويتضمن تمثيل البداية الإزاحة الزمنية.

ضبط الحجم وسياسة التقرير

حدد حدود حجم الملف وطول الحقل وعدد الصفوف وعينات الأخطاء المحتفظ بها للمدخلات الكبيرة. يوفر تدفق الصفوف ذاكرة النص الخام، لكن جمع كل السجلات أو الأخطاء قد يستنفدها. استخدم عدادات وعينات محدودة إذا احتجت ملخصا. حدد الترتيب والتقريب لتقرير قابل للتكرار. توجد حدود أخرى عند فتح CSV في جدول بيانات؛ فقد تفسر بعض التطبيقات بدايات حقول معينة كصيغ، فتحتاج سياسة تناسب المستهلك. لا يجعل محلل التنسيق كل استعمال لاحق آمنا تلقائيا.

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

إنشاء حقل زائد بسبب فاصلة مقتبسة

لماذا يحدث؟
استخدم التنفيذ تقسيم النص بدلا من قواعد CSV.
كيف تصلحه؟
استخدم csv.reader أو DictReader باللهجة المتوقعة.
كيف تتجنب تكراره؟
اختبر الفواصل المقتبسة والأسطر المضمنة.

تغير فرق الوقت باختلاف منطقة الجهاز

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

استهلاك ذاكرة غير محدودة رغم التدفق

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

اختبر فهمك

1. كيف تبلغ عن ثلاث كميات خاطئة في CSV كبير دون حفظ كل الصفوف؟

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

مر مع أرقام الصفوف وعد الأخطاء واحتفظ بأول ثلاثة ملخصات آمنة فقط. تابع وفق سياسة الدفعة، ثم اعرض العدد الكلي والعينة المحدودة مع بيان أنها غير شاملة إن زادت الأخطاء.

2. لماذا يجب أن يتضمن الطابع الزمني المتبادل إزاحة أو اتفاق منطقة صريحا؟

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

لا تحدد قراءة الساعة المحلية وحدها لحظة فريدة، وقد تلتبس عند الانتقالات. يحدد 2026-01-01T09:00:00+00:00 لحظة واضحة. احفظ المنطقة المسماة منفصلة إذا اعتمدت مواعيد مستقبلية على قواعدها المدنية المتغيرة.

أهم ما تعلمته

  • قد يتضمن التنسيق الصحيح بيانات مجال خاطئة.
  • استخدم قواعد CSV الفعلية ومعاني زمنية صريحة.
  • حدد المدخل والحالة التشخيصية المحتفظ بها.

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