آموزش خواندن و نوشتن CSV در پایتون

یکی از فرمت‌های نگهداری داده در سیستم‌های کامپیوتری CSV است. در این آموزش ۲ روش کار با CSV در پایتون را یاد می‌گیریم تا بتوانیم محتوای csv را با پایتون خوانده یا یک فایل جدید با دیتاهای خودمان ایجاد کنیم.

CSV یک فرمت استاندارد برای قالب‌بندی محتوای متنی است. معمولاً داده‌های ساختاریافته و جدولی را می‌توان به شکل بسیار ساده‌ای در این فرمت قرار داد. هر خط از فایل، یکی از رکوردهای اطلاعاتی ماست و داده‌ها در هر خط با علامت یکسانی جدا شده‌اند.

طبق این استاندارد، علامت جداکننده CSV کاما (,) است. اما ممکن است نیاز باشد با فایل‌هایی که از کاراکتر دیگری استفاده کرده‌اند نیز کار کنید. اگر می‌خواهید با excel کار کنید (فرمت xlsx، آموزش اکسل در پایتون را ببینید.)

برای کار با CSV در پایتون روش‌های مختلفی وجود دارد. در این آموزش ۲ روش را بررسی می‌کنیم. روش اول استفاده از کتابخانه CSV است. با کمک این ماژول می‌توانیم یک فایل را خوانده یا CSV جدید ایجاد کنیم.

روش دوم استفاده از کتابخانه pandas است. اگر می‌خواهید روی داده‌ها پردازش‌های آماری کنید یا از آن‌ها برای یادگیری ماشین و داده کاوی استفاده کنید، این روش برای شماست!

کار با ماژول CSV در پایتون

اگر نصب پایتون را به روش عادی انجام داده باشید، این ماژول در کتابخانه‌های پیشفرض وجود دارد و نیازی به نصب آن نیست.

ابتدا می‌بایست این کتابخانه را به برنامه خود اضافه کنیم. پس قبل از نوشتن هر کد دیگری، با import آن را اضافه می‌کنم.

import csv

در این آموزش فایل CSV به نام employee.csv دارم. در آن چند سطر داده قرار دادم تا از آن‌ها استفاده کنیم.

نمونه محتوای فایل CSV
نمونه محتوای فایل CSV

باز کردن csv با پایتون

در ابتدا باید فایل csv خود را باز کنیم. برای این کار از تابع open() استفاده می‌کنم. آدرس و اسم فایل را به صورت رشته در آرگومان اول قرار می‌دهیم.

file = open("employee.csv")

این تابع پارامترهای دیگری نیز می‌گیرد. مثلاً در پارامتر دوم می‌توانیم حالت (mode) باز کردن فایل را مشخص کنیم. اگر حالت خاصی را تعیین نکنیم، فایل را برای خواندن (مد r) باز می‌کند. یعنی دستور زیر با دستور بالا یکسان خواهد بود:

file = open("employee.csv", "r")

اگر مایلید پارامترهای این تابع و روند خواندن و نوشتن فایل را یاد بگیرید، آموزش کار با فایل در پایتون را ببینید.

حالا با متد reader() در csv فایل باز شده را می‌خوانیم. همان شئ فایل را به عنوان ورودی این تابع قرار می‌دهیم.

data = csv.reader(file)

این تابع به طور پیشفرض، جداکننده را کاراکتر کاما (,) در نظر می‌گیرد. اگر در فایل شما از علامت دیگری استفاده شده، می‌توانید آن را در آرگومان delimiter تعریف کنید. خط زیر با دستور بالا هیچ تفاوتی ندارد:

data = csv.reader(file, delimiter=",")

اگر نوع data را بررسی کنیم، می‌بینیم که یک شئ از کلاس _csv.reader است. (کلاس در پایتون) این شئ یک تکرارگر یا iterable پایتون است که می‌توانیم از آن در حلقه‌ها استفاده کنیم.

بررسی نوع CSV Reader پایتون
بررسی نوع CSV Reader پایتون

توجه کنید که مشابه کار با فایل‌ها، پس از باز کردن csv با کد پایتون بالا، فقط یک بار می‌توانیم از ابتدا تا انتهای آن حرکت کنیم.

خواندن فایل CSV

سطر اول فایلی که اینجا داریم عنوان داده‌هاست. پس باید خط اول را خوانده و در صورت نیاز در جایی نگه داریم. برای این کار از تابع next() استفاده می‌کنم. این تابع یک سطر از داده‌های ما را خوانده و به صورت لیست به ما می‌دهد.

در قطعه کد زیر نحوه استفاده و خروجی آن را می‌بینید:

header = next(data)

# ['id', 'name', 'family', 'department', 'hireDate']

برای خواندن بقیه داده‌ها از حلقه for پایتون استفاده می‌کنم. در قطعه کد زیر، اعضای فرضی سازمان را در خروجی چاپ می‌کنم.

for employee in data:
    print(f"{employee[1]} {employee[2]} work in {employee[3]} department")
فرمت دهی رشته متن در پایتون با format

فرمت دهی رشته متن در پایتون با format

به عنوان جمع‌بندی این بخش، برای خواندن فایل CSV در پایتون کدی شبیه به زیر داریم. در اینجا، پس از خواند فایل، اطلاعات آن را در لیست all_employee قرار داده‌ام.

import csv
file = open('employee.csv')
data = csv.reader(file)

header = next(data)

all_employee = []
for employee in data:
    all_employee.append(employee)

file.close()

در انتهای کار با فایل بهتر است آن را ببندیم. به همین دلیل از file.close() استفاده کرده‌ام.

تبدیل CSV به دیکشنری

وقتی داده‌های موجود در فایل را چاپ می‌کردیم، دیدید که از اندیس برای دسترسی به داده‌های هر سطر استفاده کردم. این کار برای برنامه‌های بزرگ و در حال توسعه ممکن است کمی سخت باشد. مخصوصاً اگر ساختار فایل‌های csv که در پایتون فراخوانی می‌شوند تغییر کند!

برای اینکه به صورت کلید-مقدار به مقادیر csv دسترسی داشته باشیم، می‌توانیم کل فایل را به دیکشنری تبدیل کنیم. (دیکشنری در پایتون)

برای تبدیل csv به دیکشنری در پایتون از تابع DictReader() استفاده می‌کنیم. این تابع به طور پیشفرض، مقادیر سطر اول را عنوان ستون‌ها در نظر می‌گیرد. حالا هر آیتم در این شئ، یک دیکشنری است که کلیدهایی متناسب با ستون‌ها دارد.

import csv
file = open('employee.csv')
data = csv.DictReader(file)

for employee in data:
    print(f"{employee['name']} {employee['family']} work in {employee['department']} department")
file.close()

ایجاد و نوشتن CSV با پایتون

برای نوشتن CSV نیز از همین کتابخانه استفاده می‌کنیم. در ابتدا باید فایل را برای نوشتن باز کنیم. اگر چنین فایلی وجود نداشته باشد، پایتون آن را ایجاد خواهد کرد. بنابراین نیازی به ایجاد فایل به طور جداگانه نیست.

به دلیل اینکه از تابعی برای نوشتن سطرهای csv استفاده می‌کنیم که خودش کاراکتر خط بعدی را قرار می‌دهد، موقع باز کردن فایل باید مشخص کنیم که کاراکتر خط بعدی خالی باشد. در غیر اینصورت سطرها یک در میان خالی خواهند شد.

از تابع writer() برای ایجاد شئ نویسنده در فایل استفاده می‌کنیم. برای نوشتن داده‌ها ۲ تابع داریم:

  • writerow() یک لیست گرفته و اعضای آن را به عنوان داده‌های یک سطر وارد می‌کند.
  • writerows() یک لیست گرفته و هر عضو لیست را به عنوان یک سطر می‌نویسد. (معمولاً یک لیست دوبعدی یا تودرتو داریم)

در قطعه کد زیر، از اولی برای نوشتن نام ستون‌ها و از دومی برای ثبت داده‌ها استفاده می‌کنم:

import csv

file = open("new.csv", "w", newline="")
writer = csv.writer(file)

data = [['sara', 22, 4.9],
         ['omid', 24, 3.7],
         ['nima', 25, 3.9],
         ['ghazal', 21, 2.9]]

writer.writerow( ['name', 'age', 'salary'] )
writer.writerows( data )

file.close()

مرور روش کار با csv

در این آموزش یاد گرفتیم چطور با فایل‌های CSV در پایتون کار کنیم. قطعاً کتابخانه‌های دیگری نیز برای این کار وجود دارد که بنا به نیاز یا محدودیت‌هایی که داریم می‌توانیم از آن‌ها استفاده کنیم. البته در کتابخانه csv نیز تابع‌های بیشتری وجود دارد. اگر مایلید بیشتر با آن آشنا شوید، به مستندات انگلیسی آن مراجعه کنید.

با تابع reader() یک شئ reader از فایل ایجاد کردیم تا بتوانیم به داده‌های آن دسترسی داشته باشیم. همچنین می‌توانستیم جداکننده را با آرگومان delimiter تعیین کنیم. در بخش دوم با writer() یک شئ writer ایجاد کردیم تا بتوانیم داده‌هایمان را با پایتون در csv بنویسیم.

از آنجا که csv یک فایل متنی ساده است، می‌توانیم آن را بدون استفاده از این کتابخانه‌ها و فقط با خواند محتوای آن پردازش کنیم. در این حالت باید از توابع پردازش و جداکننده رشته متنی در پایتون استفاده کنیم.

اگر این داده‌ها را برای کارهای data mining نیاز دارید و می‌خواهید از pandas استفاده کنید، می‌توانید از متد read_csv() در این کتابخانه استفاده کنید. این تابع آدرس و اسم فایل را در ورودی گرفته و به ما یک data frame می‌دهد. در نتیجه می‌توان از داده‌ها به راحتی استفاده کرد.

امیدوارم با این آموزش بتوانید با فایل‌های CSV در پایتون کار کنید. اگر تجربه یا سؤالی در این مورد دارید، از بخش دیدگاه‌ها مطرح کنید.