إدارة ملفات CSV: استخراج وتصدير جداول البيانات باستخدام بايثون


إدارة ملفات CSV: استخراج وتصدير جداول البيانات باستخدام بايثون

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

الخطوة 1: قراءة ملف CSV وتحليل البيانات

سنبدأ بقراءة ملف CSV موجود. لنفترض أن لدينا ملفًا باسم بيانات_المنتجات.csv يحتوي على معلومات عن المنتجات. سنستخدم وحدة csv لقراءة هذا الملف وتحويل صفوفه إلى قائمة من القواميس لسهولة المعالجة.

ملاحظة تقنية: استخدام csv.DictReader يجعل كل صف كقاموس، حيث تكون مفاتيح القاموس هي رؤوس الأعمدة في ملف CSV.

لنقم بإنشاء ملف بيانات_المنتجات.csv أولاً (إذا لم يكن موجودًا):

المنتج,الفئة,السعر,الكمية
لابتوب,إلكترونيات,1200,10
ماوس,إلكترونيات,25,50
كتاب,أدوات_مكتبية,15,100
قلم,أدوات_مكتبية,2,200
شاشة,إلكترونيات,300,15

الآن، الكود لقراءة الملف:

import csv
import os

# اسم الملف الذي سنقرأ منه
اسم_ملف_القراءة = 'بيانات_المنتجات.csv'
بيانات_المنتجات = []

# إنشاء ملف تجريبي إذا لم يكن موجوداً
if not os.path.exists(اسم_ملف_القراءة):
    print(f"إنشاء ملف تجريبي '{اسم_ملف_القراءة}'...")
    with open(اسم_ملف_القراءة, mode='w', encoding='utf-8', newline='') as f:
        f.write("المنتج,الفئة,السعر,الكمية\n")
        f.write("لابتوب,إلكترونيات,1200,10\n")
        f.write("ماوس,إلكترونيات,25,50\n")
        f.write("كتاب,أدوات_مكتبية,15,100\n")
        f.write("قلم,أدوات_مكتبية,2,200\n")
        f.write("شاشة,إلكترونيات,300,15\n")
    print("تم إنشاء الملف التجريبي بنجاح.\n")

try:
    # فتح الملف للقراءة باستخدام 'utf-8' لضمان التعامل مع الأحرف العربية
    with open(اسم_ملف_القراءة, mode='r', encoding='utf-8', newline='') as ملف_csv:
        # استخدام DictReader لقراءة البيانات كقواميس
        قارئ_csv = csv.DictReader(ملف_csv)
        # المرور على كل صف في الملف وإضافته إلى قائمة البيانات
        for صف in قارئ_csv:
            بيانات_المنتجات.append(صف)
    print("تم قراءة البيانات بنجاح:")
    for منتج in بيانات_المنتجات:
        print(منتج)
except FileNotFoundError:
    print(f"خطأ: الملف '{اسم_ملف_القراءة}' غير موجود.")
except Exception as e:
    print(f"حدث خطأ أثناء قراءة الملف: {e}")

الخطوة 2: تصفية البيانات ومعالجتها

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

ملاحظة تقنية: من المهم تحويل البيانات الرقمية من سلاسل نصية إلى أنواع رقمية (مثل int أو float) قبل إجراء أي عمليات حسابية عليها لتجنب الأخطاء.
# قائمة لتخزين المنتجات الإلكترونية المفلترة
منتجات_إلكترونية = []

for منتج in بيانات_المنتجات:
    # تحويل السعر والكمية إلى أرقام (أعداد صحيحة أو عشرية)
    try:
        منتج['السعر'] = float(منتج['السعر'])
        منتج['الكمية'] = int(منتج['الكمية'])
    except ValueError:
        print(f"تحذير: قيمة غير صالحة للسعر أو الكمية في المنتج: {منتج['المنتج']}. سيتم تجاهل هذا المنتج.")
        continue # تخطي هذا المنتج إذا كانت القيم غير صالحة

    # تصفية المنتجات حسب الفئة
    if منتج['الفئة'] == 'إلكترونيات':
        منتجات_إلكترونية.append(منتج)

print("\nالمنتجات الإلكترونية المفلترة:")
for منتج in منتجات_إلكترونية:
    print(منتج)

الخطوة 3: تصدير البيانات المعالجة إلى ملف CSV جديد

أخيرًا، بعد معالجة البيانات، قد نرغب في حفظ النتائج في ملف CSV جديد. سنقوم بتصدير قائمة المنتجات الإلكترونية المفلترة إلى ملف جديد باسم منتجات_إلكترونية.csv.

ملاحظة تقنية: عند الكتابة باستخدام csv.DictWriter، يجب توفير قائمة بأسماء رؤوس الأعمدة (fieldnames) لضمان كتابة البيانات بشكل صحيح.
# اسم الملف الذي سنكتب إليه
اسم_ملف_الكتابة = 'منتجات_إلكترونية.csv'

# تحديد رؤوس الأعمدة للملف الجديد
# تأكد من أن هذه الرؤوس تطابق مفاتيح القواميس في قائمة "منتجات_إلكترونية"
رؤوس_الأعمدة = ['المنتج', 'الفئة', 'السعر', 'الكمية']

try:
    # فتح الملف للكتابة باستخدام 'utf-8'
    with open(اسم_ملف_الكتابة, mode='w', encoding='utf-8', newline='') as ملف_csv_جديد:
        # إنشاء كاتب DictWriter
        كاتب_csv = csv.DictWriter(ملف_csv_جديد, fieldnames=رؤوس_الأعمدة)

        # كتابة رؤوس الأعمدة أولاً
        كاتب_csv.writeheader()

        # كتابة كل صف من البيانات المفلترة
        for منتج in منتجات_إلكترونية:
            كاتب_csv.writerow(منتج)
    print(f"\nتم تصدير المنتجات الإلكترونية بنجاح إلى '{اسم_ملف_الكتابة}'.")
except Exception as e:
    print(f"حدث خطأ أثناء كتابة الملف: {e}")

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

إليك الكود كاملاً لجميع الخطوات التي قمنا بها، من قراءة البيانات وتصفيتها إلى تصديرها.

import csv
import os # لاستخدام os.path.exists للتحقق من وجود الملف

# --- إعداد ملف CSV الأولي (للتجربة) ---
# هذا الجزء سيقوم بإنشاء ملف 'بيانات_المنتجات.csv' إذا لم يكن موجوداً
اسم_ملف_القراءة = 'بيانات_المنتجات.csv'
if not os.path.exists(اسم_ملف_القراءة):
    print(f"إنشاء ملف تجريبي '{اسم_ملف_القراءة}'...")
    with open(اسم_ملف_القراءة, mode='w', encoding='utf-8', newline='') as f:
        f.write("المنتج,الفئة,السعر,الكمية\n")
        f.write("لابتوب,إلكترونيات,1200,10\n")
        f.write("ماوس,إلكترونيات,25,50\n")
        f.write("كتاب,أدوات_مكتبية,15,100\n")
        f.write("قلم,أدوات_مكتبية,2,200\n")
        f.write("شاشة,إلكترونيات,300,15\n")
    print("تم إنشاء الملف التجريبي بنجاح.\n")
# -------------------------------------

# الخطوة 1: قراءة ملف CSV وتحليل البيانات
بيانات_المنتجات = []
try:
    with open(اسم_ملف_القراءة, mode='r', encoding='utf-8', newline='') as ملف_csv:
        قارئ_csv = csv.DictReader(ملف_csv)
        for صف in قارئ_csv:
            بيانات_المنتجات.append(صف)
    print("تم قراءة البيانات بنجاح:")
    for منتج in بيانات_المنتجات:
        print(منتج)
except FileNotFoundError:
    print(f"خطأ: الملف '{اسم_ملف_القراءة}' غير موجود.")
    exit() # الخروج من السكربت إذا لم يتم العثور على الملف
except Exception as e:
    print(f"حدث خطأ أثناء قراءة الملف: {e}")
    exit()

# الخطوة 2: تصفية البيانات ومعالجتها
منتجات_إلكترونية = []
for منتج in بيانات_المنتجات:
    try:
        منتج['السعر'] = float(منتج['السعر'])
        منتج['الكمية'] = int(منتج['الكمية'])
    except ValueError:
        print(f"تحذير: قيمة غير صالحة للسعر أو الكمية في المنتج: {منتج['المنتج']}. سيتم تجاهل هذا المنتج.")
        continue

    if منتج['الفئة'] == 'إلكترونيات':
        منتجات_إلكترونية.append(منتج)

print("\nالمنتجات الإلكترونية المفلترة:")
for منتج in منتجات_إلكترونية:
    print(منتج)

# الخطوة 3: تصدير البيانات المعالجة إلى ملف CSV جديد
اسم_ملف_الكتابة = 'منتجات_إلكترونية.csv'
رؤوس_الأعمدة = ['المنتج', 'الفئة', 'السعر', 'الكمية']

try:
    with open(اسم_ملف_الكتابة, mode='w', encoding='utf-8', newline='') as ملف_csv_جديد:
        كاتب_csv = csv.DictWriter(ملف_csv_جديد, fieldnames=رؤوس_الأعمدة)
        كاتب_csv.writeheader()
        for منتج in منتجات_إلكترونية:
            كاتب_csv.writerow(منتج)
    print(f"\nتم تصدير المنتجات الإلكترونية بنجاح إلى '{اسم_ملف_الكتابة}'.")
except Exception as e:
    print(f"حدث خطأ أثناء كتابة الملف: {e}")

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

عند تشغيل السكربت، ستلاحظ طباعة البيانات المقروءة أولاً، ثم المنتجات المفلترة (الإلكترونيات فقط). أخيرًا، سيتم إنشاء ملف جديد باسم منتجات_إلكترونية.csv في نفس مجلد السكربت. سيحتوي هذا الملف على البيانات التالية:

المنتج,الفئة,السعر,الكمية
لابتوب,إلكترونيات,1200.0,10
ماوس,إلكترونيات,25.0,50
شاشة,إلكترونيات,300.0,15

بالإضافة إلى ذلك، ستظهر رسائل توضيحية في سطر الأوامر (الكونسول) تشير إلى تقدم العملية، مثل:

إنشاء ملف تجريبي 'بيانات_المنتجات.csv'...
تم إنشاء الملف التجريبي بنجاح.

تم قراءة البيانات بنجاح:
{'المنتج': 'لابتوب', 'الفئة': 'إلكترونيات', 'السعر': '1200', 'الكمية': '10'}
{'المنتج': 'ماوس', 'الفئة': 'إلكترونيات', 'السعر': '25', 'الكمية': '50'}
{'المنتج': 'كتاب', 'الفئة': 'أدوات_مكتبية', 'السعر': '15', 'الكمية': '100'}
{'المنتج': 'قلم', 'الفئة': 'أدوات_مكتبية', 'السعر': '2', 'الكمية': '200'}
{'المنتج': 'شاشة', 'الفئة': 'إلكترونيات', 'الكمية': '15', 'السعر': '300'}

المنتجات الإلكترونية المفلترة:
{'المنتج': 'لابتوب', 'الفئة': 'إلكترونيات', 'السعر': 1200.0, 'الكمية': 10}
{'المنتج': 'ماوس', 'الفئة': 'إلكترونيات', 'السعر': 25.0, 'الكمية': 50}
{'المنتج': 'شاشة', 'الفئة': 'إلكترونيات', 'السعر': 300.0, 'الكمية': 15}

تم تصدير المنتجات الإلكترونية بنجاح إلى 'منتجات_إلكترونية.csv'.