فایلهای CSV یکی از فرمتهای متداول برای ذخیره دادهها به صورت جدولی هستند و در برنامهنویسی به عنوان یکی از مهمترین وسایل برای مدیریت دادهها مورد استفاده قرار میگیرند. در این مقاله، کار با فایل csv در پایتون آشنا خواهیم شد. ما نحوه خواندن و نوشتن اطلاعات از/به فایلهای CSV، پردازش دادهها و استفاده از کتابخانههای مفیدی را برای کار با این فرمت خواهیم آموخت. همچنین پیشنهاد میکنیم دیگر آموزشهای ما نیز مطالعه نمایید:
- لیست و نحوه کار با آن
- دیکشنری در پایتون
- Tuple در پایتون
- if در پایتون
- حلقه for
- حلقه while
- تابع در پایتون
- تبدیل نوع داده
مفهوم فایلهای CSV
فایلهای CSV یا “Comma-Separated Values” به معنای “مقادیر جداشده توسط ویرگول” هستند. این فرمت به عنوان یک روش ساده و قابل درک برای ذخیره دادههای جدولی مورد استفاده قرار میگیرد. در فایلهای CSV، هر سطر از جدول با یک خط در فایل نشان گردیده و مقادیر هر ستون با ویرگول یا کاراکتر دیگری جدا میشوند (از آنجایی که نام “Comma-Separated Values” نشانگر جداکردن مقادیر با ویرگول است، اما ممکن است ستونها با سایر کاراکترها نیز جدا شوند).
کار با فایل csv در پایتون
برای کار با فایل csv در پایتون، میتوانید از کتابخانه csv
استفاده کنید. این کتابخانه قابلیتهای مختلفی برای کار با فایلهای CSV ارائه میدهد.
خواندن با استفاده از csv.reader
یکی از روشهای خواندن فایلهای CSV با استفاده از csv.reader
است. این کلاس به شما امکان میدهد تا فایل CSV را به عنوان ورودی بگیرید و دادهها را به صورت یک ماتریس (لیستی از لیستها) در زبان پایتون بخوانید.
به عنوان مثال، فرض کنید یک فایل CSV به نام data.csv
داریم که محتوای زیر را دارد:
نام,سن,شغل
علی,30,مهندس
سارا,25,دانشجو
رضا,35,معلم
حالا میتوانیم از کد زیر برای خواندن این فایل استفاده کنیم:
import csv
# باز کردن فایل CSV برای خواندن
with open('data.csv', newline='', encoding='utf-8') as file:
# ساخت شیء csv.reader با استفاده از فایل
reader = csv.reader(file)
# خواندن و چاپ محتوای فایل
for row in reader:
print(row)
خروجی این کد به صورت زیر خواهد بود:
['نام', 'سن', 'شغل']
['علی', '30', 'مهندس']
['سارا', '25', 'دانشجو']
['رضا', '35', 'معلم']
خواندن با استفاده از csv.DictReader
یک روش دیگر برای کار با فایل csv در پایتون با استفاده از کتابخانه csv
، استفاده از csv.DictReader
است. این کلاس به شما امکان میدهد تا فایل CSV را به عنوان ورودی بگیرید و دادهها را به صورت یک دیکشنری (dictionary) در زبان پایتون بخوانید.
با استفاده از csv.DictReader
، میتوانید به هر ردیف دسترسی داشته و به مقادیر با استفاده از نام ستونها دسترسی داشته باشید.
import csv
# باز کردن فایل CSV برای خواندن
with open('data.csv', newline='', encoding='utf-8') as file:
# ساخت شیء csv.DictReader با استفاده از فایل
reader = csv.DictReader(file)
# خواندن و چاپ محتوای فایل
for row in reader:
print(row)
خروجی این کد به صورت زیر خواهد بود:
OrderedDict([('نام', 'علی'), ('سن', '30'), ('شغل', 'مهندس')])
OrderedDict([('نام', 'سارا'), ('سن', '25'), ('شغل', 'دانشجو')])
OrderedDict([('نام', 'رضا'), ('سن', '35'), ('شغل', 'معلم')])
همانطور که مشاهده میشود، هر ردیف به عنوان یک دیکشنری به نام ستونها خوانده گردیده است.
نوشتن فایلهای CSV در پایتون
برای نوشتن دادهها در فایل CSV، همچنان از کتابخانه csv
استفاده میکنیم. برای این کار، میتوانیم از csv.writer
یا csv.DictWriter
استفاده کنیم.
نوشتن با استفاده از csv.writer
از csv.writer
برای نوشتن دادهها در فایلهای CSV به صورت ردیف به ردیف استفاده میشود. به عنوان مثال، برای نوشتن دادههای زیر به یک فایل CSV:Copy code
نام,سن,شغل
علی,30,مهندس
سارا,25,دانشجو
رضا,35,معلم
میتوانیم از کد زیر استفاده کنیم:
import csv
# ایجاد یک فایل CSV برای نوشتن
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
# ساخت شیء csv.writer با استفاده از فایل
writer = csv.writer(file)
# نوشتن سرصفحه
writer.writerow(['نام', 'سن', 'شغل'])
# نوشتن ردیفها
writer.writerow(['علی', '30', 'مهندس'])
writer.writerow(['سارا', '25', 'دانشجو'])
writer.writerow(['رضا', '35', 'معلم'])
نوشتن با استفاده از csv.DictWriter
از csv.DictWriter
برای نوشتن دادهها در فایلهای CSV به صورت دیکشنری به دیکشنری استفاده میشود. این روش به شما امکان میدهد دادهها را به صورت دقیقتر به ستونهای مشخص نوشته و مقادیر به وسیله نام ستونها مشخص شوند.
import csv
# ایجاد یک فایل CSV برای نوشتن
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
# نام ستونها
fieldnames = ['نام', 'سن', 'شغل']
# ساخت شیء csv.DictWriter با استفاده از فایل و نام ستونها
writer = csv.DictWriter(file, fieldnames=fieldnames)
# نوشتن سرصفحه
writer.writeheader()
# نوشتن دادهها به صورت دیکشنری
writer.writerow({'نام': 'علی', 'سن': '30', 'شغل': 'مهندس'})
writer.writerow({'نام': 'سارا', 'سن': '25', 'شغل': 'دانشجو'})
writer.writerow({'نام': 'رضا', 'سن': '35', 'شغل': 'معلم'})
پردازش دادههای فایل csv در پایتون
پس از خواندن دادههای CSV یا نوشتن دادهها در فایلهای CSV، ممکن است نیاز به پردازش و تغییر دادهها داشته باشید. در اینجا چند مثال از عملیاتهای معمولی پردازش دادههای CSV در پایتون آوردهایم:
محاسبات آماری
میتوانید از کتابخانههای آماری مانند NumPy برای انجام محاسبات آماری بر روی دادههای CSV استفاده کنید. به عنوان مثال، میتوانید میانگین سن افراد را محاسبه کنید:
import csv
import numpy as np
ages = []
# باز کردن فایل CSV برای خواندن
with open('data.csv', newline='', encoding='utf-8') as file:
reader = csv.DictReader(file)
# خواندن دادههای سن افراد و اضافه کردن به لیست
for row in reader:
ages.append(int(row['سن']))
# محاسبه میانگین سن
average_age = np.mean(ages)
print(f"میانگین سن: {average_age}")
جستجو و فیلترینگ دادهها
برای جستجو و فیلترینگ دادهها در فایلهای CSV، میتوانید از لیستها و شرطها استفاده کنید. به عنوان مثال، میتوانید افرادی را که سن آنها بیشتر از ۳۰ سال است را پیدا کنید:
import csv
# لیستی برای ذخیره افراد با سن بیشتر از ۳۰ سال
older_than_30 = []
# باز کردن فایل CSV برای خواندن
with open('data.csv', newline='', encoding='utf-8') as file:
reader = csv.DictReader(file)
# جستجو و فیلترینگ دادهها
for row in reader:
if int(row['سن']) > 30:
older_than_30.append(row)
# چاپ افراد با سن بیشتر از ۳۰ سال
for person in older_than_30:
print(f"{person['نام']} - سن: {person['سن']}")
ترسیم نمودار
اگر میخواهید دادههای خود را به صورت نمودار نشان دهید، میتوانید از کتابخانههای ترسیم نمودار مانند Matplotlib استفاده کنید. به عنوان مثال، میتوانید تعداد افراد در هر سن را رسم کنید:
import csv
import matplotlib.pyplot as plt
# دیکشنری برای ذخیره تعداد افراد در هر سن
age_counts = {}
# باز کردن فایل CSV برای خواندن
with open('data.csv', newline='', encoding='utf-8') as file:
reader = csv.DictReader(file)
# جمعآوری تعداد افراد در هر سن
for row in reader:
age = int(row['سن'])
if age in age_counts:
age_counts[age] += 1
else:
age_counts[age] = 1
# تجسم نمودار
ages = list(age_counts.keys())
counts = list(age_counts.values())
plt.bar(ages, counts)
plt.xlabel('سن')
plt.ylabel('تعداد')
plt.title('توزیع سنی افراد')
plt.show()