ابحث في المدونة

الأحد، 30 يناير 2022

كيف تتم معالجة ملفات csv بلغة البايثون


أول ما يتبادر لدى الغالبية من الناس عند استماعهم لمصطلح جداول البيانات هو برنامج microsoft excel وصيغته المعروفة ب xlsx. في حين أن ثمة أنواع ملفات أخرى لمعالجة وعرض جداول البيانات تختلف كلٌ منها من حيث البساطة وأغراض الاستخدام.

تعد ملفات csv هي أحد تلك الأنواع البسيطة لتخزين وعرض جداول البيانات بشكل مبسط. ويشير الامتداد csv إلى comma separated values أو القيم المعزولة بالفواصل, وهي الآلية التي تعتمد عليها ملفات csv في تقسيم البيانات.



مبدأ عمل ملفات csv بمزيد من التفصيل


لا تعدو ملفات csv عن كونها مستندات نصية بسيطة أعطيت الامتداد csv واعتُمد فيها مبدأ معين لكتابة البيانات. وحين القول بأنها ليست إلا ملفات نصية بسيطة فأنه من السهولة بمكان استنتاج حقيقة إمكانية فتح هذا النوع من الملفات على أي نظام تشغيل دون الحوجة إلى برامج خارجية.
ومع ذلك, فالكثير من الأدوات قد أوجدت للتعامل مع ملفات csv من ناحية استخلاص وكتابة البيانات عليها نظرًا إلى الهيكلة المنظمة التي رُتبت عليها القيم. من ضمن الأدوات المتاحة برنامج microsoft excel, جهات اتصال google, google forms, والكثير من لغات البرمجة تحتوي على مكتبة خاصة للتعامل مع هذا النوع من الملفات.
قد يأتي متسائل فيقول: ما العبرة من وجود ملفات csv بما أنها مطابقة تمامًا لخصائص المستندات النصية وكون أنه يمكن استنساخ الهيكل العام لتمثيل البيانات الموجودة في جداول csv إلى مستندات نصية بسيطة ذات الامتداد .txt?
فعلًا سؤال في محله: وجوابًا على ذلك نقول أن وجود نوع خاص بجداول البيانات بني على مقاييس قديمة وضعت منذ زمن لتصنيف مختلف أنواع البيانات لتتمكن البرامج المخصصة بالتعامل مع كل نوع من البيانات من التعرف على الملفات التي يمكن تشغيلها من خلالها, تمامًا مثل قولنا بأن ملفات .html ليست سوى مستندات نصية مكتوبة بشكل معين, غير أن الإشارة إليها باللاحقة .html ساعدت على توجيه المتصفحات, بل ونظام التشغيل في المقام الأول, على تمييز هذا النوع بكونه صفحة ويب يجب التعامل معها بشكل معين.



الشكل العام لملفات csv

لنقل أن لدينا جدولًا يحتوي على بعض البيانات العشوائية لموظفي مؤسسة من المؤسسات. سنخصص العمود الأول لرقم المعرف الوظيفي, الثاني لاسم الموظف, والثالث لمكان السكن.
الشكل العام لكتابة هذه البيانات سيكون على النحو التالي:

id, الاسم, السكن
123, محمد, مسقط
213, خالد, صحار
132, سالم, سمائل
145, حمد, المضيبي

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



طريقة إنشاء ملف csv جديد عبر نظام التشغيل ويندوز


  1. من قائمة إبدأ, قم بالبحث عن تطبيق المفكرة وفتحه.
  2. اكتب بياناتك وفقًا للشكل العام لملفات csv.
  3. اضغط على control + s لحفظ الملف.
  4. من قائمة نوع الملف, اختر جميع الملفات ( all files ).
  5. في خانة كتابة الاسم الخاص بالملف, احذف كل ما هو مكتوب ثم اكتب اسم ملفك متبوعًا باللاحقة .csv
    على سبيل المثال: سأسمي ملفي بالاسم data بالتالي سيكون الاسم كاملًا مع اللاحقة بالشكل الآتي:
    data.csv
  6. اختر المكان الذي تريد حفظ الملف فيه ثم اضغط على زر الحفظ.


قراءة ملفات csv بلغة البايثون.


تحتوي لغة البايثون ضمن مكتباتها القياسية على مكتبة خاصة للتعامل مع ملفات csv.
تتميز هذه المكتبة بشموليتها من حيث الوظائف المتاحة للقراءة والكتابة على مختلف الأشكال الخاصة بملفات csv.
دعونا الآن نتعرف على الشكل العام للكود الخاص بقراءة ملفات csv إلى قائمة بايثون (python list) سنخصصها لتخزين صفوف الجدول.


# بداية البرنامج
import csv # استدعاء الحزمة المطلوبة للتعامل مع ملفات csv

file = open("data.csv") # فتح ملف csv بالطريقة المعتادة لفتح أي مستند نصي آخر بلغة البايثون
reader = csv.reader(file) # من مكتبة csv , استخدمنا كلاس باسم reader وقمنا بتمرير الملف المفتوح إلى أول معامل من ال constructor الخاص بالكلاس.
# ينتج لنا هذا الكلاس كائنًا قابلًا للدوران من خلال الحلقة for لنحصل في كل دورة على list تحتوي على أحد صفوف الملف في كل عنصر من عناصر ال list خلية من خلايا الصف الواحد.
rows = [row for row in reader]
# في السطر أعلاه استخدمنا ما يسمى بال list comprehension لتخزين صفوف الجدول إلى قائمة الصفوف التي أنشأناها برمجيًا.
# ال list comprehension ما هو إلى حلقة for loop تُكتب في سطر واحد لتسهيل تعبئة حاويات البيانات كالقوائم والقواميس بأقل عدد ممكن من الأسطر البرمجية.
file.close() # اغلاق الملف بعد الانتهاء من استخراج البيانات منه
# نهاية البرنامج


بهذه الطريقة أصبح بإمكانك استخراج البيانات الموجودة في ملف csv والتعامل معها كقائمة بايثون ذات البعدين.
يمكنك الآن إضافة, حذف وتعديل البيانات الموجودة في هذه القائمة بكل سهولة تمامًا كما لو أنك تتعامل مع المصفوفات في أي برنامج آخر.



الكتابة إلى ملفات csv بلغة البايثون


لا تختلف كثيرًا طريقة الكتابة إلى ملفات csv عما كتبناه في البرنامج السابق.
ما سيختلف فقط هو أننا سنقوم بفتح الملف المطلوب بوضعية الكتابة بدلًا من القراءة, وسنستخدم الكلاس csv.writer بدلًا من csv.reader الذي استخدمناه آنفًا لقراءة المحتوى.
ما سنفعله الآن هو أننا سنقوم بالتعديل على القائمة rows بأن نضيف إليها صفًا جديدًا, ثم سنقوم بكتابة هذه التعديلات إلى ملف جديد سنسميه output.csv

تابعوا معي الكود

# بداية البرنامج

rows.append(["543", "عبد الله", "نزوى"]) # أضفنا موظفًا جديدًا إلى قائمة الموظفين التي استخرجناها من الملف السابق.

file = open("output.csv", "w") # فتح ملف جديد بوضعية الكتابة
writer = csv.writer(file) # من مكتبة csv , استخدمنا كلاس باسم writer وقمنا بتمرير الملف المفتوح إلى أول معامل من ال constructor الخاص بالكلاس.
"""
الآن لدينا طريقتين لكتابة المحتوى:
1. كتابة عدد من الصفوف دفعة واحدة من خلال الوظيفة writerows بأن نقوم بتمرير قائمة تحتوي على عدد من القوائم الفرعية تمثل كل منها صفًا منفصلًا.
2. كتابة صف وحيد إلى نهاية الملف باستخدام الوظيفة writerow وذلك بتمرير قائمة أحادية الأبعاد تمثل ذلكم الصف المطلوب إضافته.
"""
writer.writerows(rows) # بما أننا نريد كتابة أكثر من صف واحد إلى الملف؛ فقد استخدمنا الوظيفة writerows للقيام بذلك.
file.close() # إغلاق الملف

ملاحظة:

لعلكم انتبهتم إلى مسألة أن csv.reader و csv.writer يتعاملان مع الصفوف على شكل قوائم بايثون. وفي حين أنه لا إشكال في ذلك؛ فإنه من الممكن أيضًا التعامل مع تلك الصفوف على شكل قواميس بايثون أيضًا قراءةً وكتابةً
وفي حالة القراءة؛ ستحصل على قائمة ضخمة تحتوي على عدد من اقواميس, كل قاموس منها سيمثل أحد صفوف الجدول.
تمتاز هذه الطريقة بكونها تراعي مسميات الأعمدة من خلال قراءة الصف الأول من الجدول واستخلاص مسميات الأعمدة منه.
على سبيل المثال: في جدول الموظفين الذي كان يحتوي في صفه الأول على القيم التالية id, الاسم, السكن؛ فإن شكل الصف الأول سيكون على النحو التالي
{"id": "123",
"الاسم": "محمد",
"السكن": "مسقط"}

للاستفادة من ذلك؛ ستستخدم الكلاس DictReader بدلًا من الكلاس القياسي للقراءة, والكلاس DictWriter بدلًا من الكلاس القياسي للكتابة.

هناك 3 تعليقات:

  1. موضوع جميل شكرا لمجهودك 🌹

    ردحذف
  2. شرح رائع, بالتوفيق.
    أتمنا منك تشرح لنا طريقة تشفير ملفات dat /dir التي تكون نتجة بواسطة مكتبة ال shelve ولاكن أقصد بالتشفير مِنع استخراج ما بداخلها بواسطة البايثون نفسها.
    إي إلى بوضع مفتاح التشفير أو ما شابه.

    ردحذف
  3. أنا سعيدة جدا لأنني تعرفت على هذه المدونة الرائعة ، والتي أزورها لأول مرة. شكرا جزيلا أستاذ سليمان على شروحاتك المفيدة. لقد تعلمت منك الكثير. شكرا من أعماق القلب أستاذنا الفاضل. تحياتي لكم من الجزائر.

    ردحذف

قل شيئًا