ملفات القيم المنفصلة بفواصل، أو ملفات CSV، هي أكثر أنواع الملفات شيوعًا لتخزين البيانات الجدولية. لماذا تريد قراءة ملفات CSV في Python؟ ربما أوصلتك رحلتك البرمجية إلى نقطة تحتاج فيها إلى العمل بالملفات. أو ربما تريد إجراء حسابات على البيانات المجمعة من مستشعر إنترنت الأشياء.
الطريقة الأسهل للتعامل مع ملفات CSV في Python هي استخدام وحدة PANDAS. ومن هناك، يمكنك المضي قدمًا في معالجة بياناتك وتصورها.
قراءة ملف CSV في قائمة القوائم
تخيل أنك تعمل على بيانات من امتحانات الفصل الدراسي. لديك أسماء ودرجات، وتريد حساب متوسط الفصل الدراسي. من أجل التبسيط، لنفترض أن الدرجات تتراوح من 1 (الأسوأ) إلى 6 (الأفضل). لدينا البيانات بالتنسيق أدناه، في ملف يسمى data.csv:
id,student,grade
1,John,4
2,Emily,5
3,Emma,3
...
والتي يمكن تمثيلها بالجدول:
id | student | grade |
1 | John | 4 |
2 | Emily | 5 |
3 | Emma | 3 |
كما ترى، يستخدم الفاصلة كفاصل، ولدينا صف رأسي. بعد أن عرفنا كل ذلك، دعنا نكتب الكود!
>>> import csv
>>>
>>> file = open("data.csv", "r")
>>> data = list(csv.reader(file, delimiter=","))
>>> file.close()
>>>
>>> print(data)
[['id', 'student', 'grade'], ['1', 'John', '4'], ['2', 'Emily', '5'], ['3', 'Emma', '3'], ['4', 'Patricia', '5'], ['5', 'James', '2'], ['6', 'Michael', '4'], ['7', 'David', '3'], ['8', 'Linda', '5'], ['9', 'Andrew', '5'], ['10', 'Mary', '6'], ['11', 'Kevin', '6'], ['12', 'Barbara', '1'], ['13', 'George', '1'], ['14', 'Peter', '3'], ['15', 'Zach', '4'], ['16', 'Susan', '4'], ['17', 'Lisa', '4'], ['18', 'Tim', '4.5']]
في الأساس، هذا كل شيء! دعنا نراجع البرنامج النصي سطرًا بسطر.
في السطر الأول نقوم باستيراد وحدة csv
ثم نفتح الملف في وضع القراءة ونقوم بتعيين معرّف الملف إلى متغير file
.
بعد ذلك، نعمل على الملف المفتوح باستخدام csv.reader()
. نحتاج فقط إلى تحديد الوسيطة الأولى، iterable
، ونحدد الفاصلة كفاصل. وكما قد تكون استنتجت من اسم الوسيطة الأولى، فإنها تتوقع تلقي iterable، لذا يمكنك أيضًا تمرير قائمة من صفوف CSV (كنص). عندما نمرر معرف ملف، يعامله csv.reader()
باعتباره iterable ويقرأ الملف بالكامل سطرًا بسطر.
تعيد csv.reader()
أيضًا كائنًا قابلًا للتكرار. فكر فيه باعتباره سلسلة من البيانات، يتم الوصول إليها واحدة تلو الأخرى ومرة واحدة فقط.
لتحويل عنصر قابل للتكرار إلى قائمة، نغلف التعبير بالكامل باستخدام list()
. إذا كنت تستخدم كميات هائلة من البيانات في أي وقت مضى – فلا تفعل ذلك – فمن المحتمل أن تنفد ذاكرة الوصول العشوائي (RAM) في جهازك. لتصبح محترفًا في التعامل مع ملفات CSV الضخمة، تحقق من دورة كيفية قراءة وكتابة ملفات CSV في Python. في الدورة، ستتعلم أيضًا كيفية إنشاء وكتابة ملفات CSV الخاصة بك.
أخيرًا، بمجرد قراءتنا للملف بالكامل وعدم الحاجة إليه بعد الآن، يمكننا إغلاقه بأمان باستخدام file.close()
. لاحظ أنك ستحصل على خطأ إدخال/إخراج إذا قررت الاستمرار في استخدام المتكررات ومحاولة استخدامها بعد الإغلاق.
حساب المتوسط
لحساب المتوسط يدويًا، نحتاج إلى قيمتين: المجموع الإجمالي لجميع الدرجات وعدد الدرجات. لحسن الحظ، يأتي Python مزودًا بدوال لكلا المهمتين.
لنبدأ باستخراج الدرجات من البيانات.
>>> [row[2] for row in data]
['grade', '4', '5', '3', '5', '2', '4', '3', '5', '5', '6', '6', '1', '1', '3', '4', '4', '4', '4.5']
لقد استخدمنا هنا بنية تسمى “فهم القائمة“.
لكن درجاتنا لا تبدو صحيحة. لدينا مشكلتان يجب حلهما. أولاً، تركنا العنوان في البيانات. ثانيًا، لا يمكننا حساب متوسط السلاسل، لذا نحتاج إلى تحويلها إلى أرقام عشرية.
لحل المشكلة الأولى، نستخدم تقسيم الفهرس ونتخطى الصف الأول. وهذا يعني أننا نكتب data[1:]
بدلاً من مجرد data
. ثم نلف row[2]
باستخدام الدالة float()
للحصول على أرقام يمكننا العمل بها.
ملاحظة جانبية: كتابة row[2]
ليس الحل الأمثل. من الواضح أننا نحصل على القيمة من العمود الثالث، ولكننا سنعود إلى هذه النقطة لاحقًا في المقالة لاستخدام أسماء الأعمدة.
>>> [float(row[2]) for row in data[1:]]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]
آه نعم! يبدو هذا صحيحًا. دعنا نعين هذا التعبير لمتغير الدرجات ونحسب القيمتين اللتين تحدثنا عنهما في بداية هذا القسم.
>>> sum_grades = sum(grades)
>>> count_grades = len(grades)
>>> grades_avg = sum_grades / count_grades
>>> print("Average:", grades_avg)
Average: 3.861111111111111
تم! أليس هذا واضحًا جدًا؟ يلخص السطر الأول القائمة بأكملها. ويحسب السطر الثاني طول القائمة، أي عدد العناصر. والسطر الثالث عبارة عن قسمة أساسية للحصول على المتوسط.
قراءة ملف CSV في قائمة القواميس
كما وعدنا سابقًا، سنرى الآن كيفية استخدام أسماء الأعمدة من الرأس للوصول إلى البيانات. للقيام بذلك، نستخدم csv.DictReader()
.
كما يوحي الاسم، فإنه يحلل كل صف كقاموس، باستخدام صف الرأس لتحديد أسماء الأعمدة. إذا لم يكن لديك صف رأس، يمكنك تحديد وسيطة أسماء الحقول. والباقي متشابه إلى حد كبير. اقرأ المزيد من التفاصيل في الوثائق الرسمية أو تعلم في دورة CSV الخاصة بنا.
دعونا نعيد كتابة الكود:
>>> import csv
>>>
>>> file = open("data.csv", "r")
>>> data = list(csv.DictReader(file, delimiter=","))
>>> file.close()
>>>
>>> print(data)
[{'id': '1', 'student': 'John', 'grade': '4'}, {'id': '2', 'student': 'Emily', 'grade': '5'}, {'id': '3', 'student': 'Emma', 'grade': '3'}, {'id': '4', 'student': 'Patricia', 'grade': '5'}, {'id': '5', 'student': 'James', 'grade': '2'}, {'id': '6', 'student': 'Michael', 'grade': '4'}, {'id': '7', 'student': 'David', 'grade': '3'}, {'id': '8', 'student': 'Linda', 'grade': '5'}, {'id': '9', 'student': 'Andrew', 'grade': '5'}, {'id': '10', 'student': 'Mary', 'grade': '6'}, {'id': '11', 'student': 'Kevin', 'grade': '6'}, {'id': '12', 'student': 'Barbara', 'grade': '1'}, {'id': '13', 'student': 'George', 'grade': '1'}, {'id': '14', 'student': 'Peter', 'grade': '3'}, {'id': '15', 'student': 'Zach', 'grade': '4'}, {'id': '16', 'student': 'Susan', 'grade': '4'}, {'id': '17', 'student': 'Lisa', 'grade': '4'}, {'id': '18', 'student': 'Tim', 'grade': '4.5'}]
بكل بساطة! الآن، يمكننا جعل استخراج الدرجات أكثر جمالاً:
>>> [float(row["grade"]) for row in data]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]
قراءة ملفات CSV في بايثون والقيام بالمزيد مع البيانات!
رائع! يأتي ايثون مزودًا بمجموعة كبيرة من الوحدات والدوال التي تجعل مثل هذه المهام أسهل بشكل كبير. في هذه المقالة، قمنا بمراجعة تحليل ملفات CSV في Python. لعرض جدول بياناتك، تعلّم من مقال حول كيفية الطباعة بشكل جميل – باستخدام Python فقط أو باستخدام وحدات إضافية.
ألقِ نظرة أيضًا على مسارنا الخاص بـ Python for Data Science من خلال تمارين عملية خطوة بخطوة. ابدأ في القيام بالمزيد باستخدام البيانات التي لديك بالفعل!
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.