مشروع مصغر: استخراج بيانات الزوار من ملف JSON وتحويلها إلى CSV


مشروع مصغر: استخراج بيانات الزوار من ملف JSON وتحويلها إلى CSV

اليوم، سنتعلم كيفية قراءة بيانات الزوار من ملف JSON وتحويلها إلى تنسيق CSV باستخدام بايثون. هذا الدرس سيجهزك للتعامل مع البيانات المنظمة بكفاءة.

الخطوة 1: تهيئة البيئة وقراءة ملف JSON

سنبدأ بإنشاء ملف JSON وهمي يحتوي على بيانات الزوار، ثم نقوم بقراءته باستخدام مكتبة json في بايثون.

ملف visitors.json (قم بإنشائه في نفس مسار السكربت):

[
  {
    "id": "v001",
    "name": "أحمد علي",
    "email": "ahmed.ali@example.com",
    "visit_date": "2023-10-26",
    "purpose": "استفسار",
    "details": {
      "age": 30,
      "gender": "ذكر"
    }
  },
  {
    "id": "v002",
    "name": "فاطمة سعيد",
    "email": "fatma.saeed@example.com",
    "visit_date": "2023-10-26",
    "purpose": "اجتماع",
    "details": {
      "age": 25,
      "gender": "أنثى"
    }
  },
  {
    "id": "v003",
    "name": "كريم محمود",
    "email": "karim.mahmoud@example.com",
    "visit_date": "2023-10-27",
    "purpose": "دعم فني",
    "details": {
      "age": 42,
      "gender": "ذكر"
    }
  }
]

الآن لنقرأ هذا الملف:

import json # لاستيراد مكتبة التعامل مع ملفات JSON
import csv  # لاستيراد مكتبة التعامل مع ملفات CSV

json_file_path = 'visitors.json' # تحديد مسار ملف JSON
visitors_data = [] # قائمة لتخزين بيانات الزوار

try:
    with open(json_file_path, 'r', encoding='utf-8') as f:
        visitors_data = json.load(f) # قراءة وتحميل البيانات من ملف JSON
    print(f"تم قراءة {len(visitors_data)} سجل زائر من ملف {json_file_path}")
except FileNotFoundError:
    print(f"خطأ: الملف {json_file_path} غير موجود.")
except json.JSONDecodeError:
    print(f"خطأ: فشل في تحليل ملف JSON. تأكد من صحة التنسيق.")
except Exception as e:
    print(f"حدث خطأ غير متوقع: {e}")

ملاحظة تقنية: استخدام with open(...) يضمن إغلاق الملف تلقائياً حتى لو حدث خطأ.

الخطوة 2: تحليل البيانات وتحديد رؤوس الأعمدة

بعد قراءة البيانات، سنقوم بتحديد الحقول التي نريد استخراجها وإنشاء قائمة برؤوس الأعمدة لملف CSV. سنقوم أيضاً بتنظيم البيانات لتتوافق مع هذه الرؤوس.

# تحديد رؤوس الأعمدة لملف CSV
# يجب أن تتطابق هذه الرؤوس مع المفاتيح التي سنستخرجها من بيانات JSON
csv_headers = ['id', 'name', 'email', 'visit_date', 'purpose', 'age', 'gender']

# قائمة لتخزين البيانات المهيكلة لملف CSV
processed_visitors = []

# المرور على كل زائر في البيانات المستخرجة من JSON
for visitor in visitors_data:
    # إنشاء قاموس جديد يحتوي على البيانات المطلوبة بالترتيب الصحيح لرؤوس CSV
    processed_visitor = {
        'id': visitor.get('id', ''), # الحصول على المعرف، أو سلسلة فارغة إذا لم يكن موجوداً
        'name': visitor.get('name', ''), # الحصول على الاسم
        'email': visitor.get('email', ''), # الحصول على البريد الإلكتروني
        'visit_date': visitor.get('visit_date', ''), # الحصول على تاريخ الزيارة
        'purpose': visitor.get('purpose', ''), # الحصول على الغرض من الزيارة
        'age': visitor.get('details', {}).get('age', ''), # الوصول إلى العمر داخل قاموس 'details'
        'gender': visitor.get('details', {}).get('gender', '') # الوصول إلى الجنس داخل قاموس 'details'
    }
    processed_visitors.append(processed_visitor) # إضافة القاموس المهيكل إلى القائمة

print(f"تمت معالجة {len(processed_visitors)} سجل زائر وجاهزة للكتابة إلى CSV.")

ملاحظة تقنية: استخدام .get(key, default_value) يساعد على تجنب الأخطاء في حال كانت بعض المفاتيح غير موجودة في سجل JSON.

الخطوة 3: كتابة البيانات إلى ملف CSV

الآن وقد أصبحت البيانات جاهزة ومنظمة، سنقوم بكتابتها إلى ملف CSV باستخدام مكتبة csv، مع التأكد من إضافة رؤوس الأعمدة.

csv_file_path = 'visitors.csv' # تحديد مسار ملف CSV الناتج

try:
    # فتح ملف CSV في وضع الكتابة (w) مع تحديد الترميز UTF-8
    # newline='' ضروري لتجنب إضافة صفوف فارغة بين السجلات في CSV
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as f:
        # إنشاء كائن DictWriter الذي سيكتب القواميس إلى ملف CSV
        writer = csv.DictWriter(f, fieldnames=csv_headers)

        writer.writeheader() # كتابة رؤوس الأعمدة كأول صف في ملف CSV

        # المرور على كل سجل زائر معالج وكتابته إلى ملف CSV
        for visitor in processed_visitors:
            writer.writerow(visitor)

    print(f"تم حفظ بيانات الزوار بنجاح في ملف {csv_file_path}")
except Exception as e:
    print(f"حدث خطأ أثناء كتابة ملف CSV: {e}")

ملاحظة تقنية: csv.DictWriter مثالي للعمل مع البيانات المنظمة كقواميس، حيث يقوم تلقائياً بمطابقة المفاتيح مع رؤوس الأعمدة المحددة.

الكود النهائي الكامل

إليك السكربت كاملاً جاهزاً للنسخ والتنفيذ:

import json
import csv

# --- الخطوة 1: تهيئة البيئة وقراءة ملف JSON ---
json_file_path = 'visitors.json'
visitors_data = []

try:
    with open(json_file_path, 'r', encoding='utf-8') as f:
        visitors_data = json.load(f)
    print(f"تم قراءة {len(visitors_data)} سجل زائر من ملف {json_file_path}")
except FileNotFoundError:
    print(f"خطأ: الملف {json_file_path} غير موجود.")
    exit() # إنهاء السكربت إذا لم يتم العثور على الملف
except json.JSONDecodeError:
    print(f"خطأ: فشل في تحليل ملف JSON. تأكد من صحة التنسيق.")
    exit()
except Exception as e:
    print(f"حدث خطأ غير متوقع: {e}")
    exit()

# --- الخطوة 2: تحليل البيانات وتحديد رؤوس الأعمدة ---
csv_headers = ['id', 'name', 'email', 'visit_date', 'purpose', 'age', 'gender']
processed_visitors = []

for visitor in visitors_data:
    processed_visitor = {
        'id': visitor.get('id', ''),
        'name': visitor.get('name', ''),
        'email': visitor.get('email', ''),
        'visit_date': visitor.get('visit_date', ''),
        'purpose': visitor.get('purpose', ''),
        'age': visitor.get('details', {}).get('age', ''),
        'gender': visitor.get('details', {}).get('gender', '')
    }
    processed_visitors.append(processed_visitor)

print(f"تمت معالجة {len(processed_visitors)} سجل زائر وجاهزة للكتابة إلى CSV.")

# --- الخطوة 3: كتابة البيانات إلى ملف CSV ---
csv_file_path = 'visitors.csv'

try:
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=csv_headers)
        writer.writeheader()
        for visitor in processed_visitors:
            writer.writerow(visitor)
    print(f"تم حفظ بيانات الزوار بنجاح في ملف {csv_file_path}")
except Exception as e:
    print(f"حدث خطأ أثناء كتابة ملف CSV: {e}")

النتيجة المتوقعة

بعد تشغيل السكربت، ستظهر لك رسائل في الطرفية (Console) توضح تقدم العملية، ثم سيتم إنشاء ملف جديد باسم visitors.csv في نفس مسار السكربت. محتوى الملف سيكون كالتالي:

id,name,email,visit_date,purpose,age,gender
v001,أحمد علي,ahmed.ali@example.com,2023-10-26,استفسار,30,ذكر
v002,فاطمة سعيد,fatma.saeed@example.com,2023-10-26,اجتماع,25,أنثى
v003,كريم محمود,karim.mahmoud@example.com,2023-10-27,دعم فني,42,ذكر

كما ستظهر الرسائل التالية في الطرفية:

تم قراءة 3 سجل زائر من ملف visitors.json
تمت معالجة 3 سجل زائر وجاهزة للكتابة إلى CSV.
تم حفظ بيانات الزوار بنجاح في ملف visitors.csv