کتابخانه csv در پایتون
کتابخانهٔ استاندارد csv در پایتون ابزاری ساده و کاربردی برای خواندن و نوشتن فایلهای CSV است. این ماژول برای مواردی که دادهها ساختار جدولی سادهای دارند مناسب است و امکان مدیریت جداکنندهها، نقلقولها و دیالکتهای مختلف CSV را فراهم میکند. در ادامه کاربردها، مثالهای عملی و نکات پیشرفته را بهصورت گامبهگام بررسی میکنیم.
چرا از ماژول csv استفاده کنیم؟
- سبک و بدون وابستگی اضافی (بخشی از کتابخانه استاندارد پایتون).
- قابلیت پیکربندی پارامترهایی مانند delimiter، quotechar و escapechar.
- دارای ابزارهایی مانند DictReader و DictWriter برای کار با ردیفها بهصورت دیکشنری.
- برای فایلهای کوچک تا متوسط مناسب است؛ برای دادههای خیلی بزرگ یا تحلیل پیچیده معمولاً pandas ترجیح داده میشود.
خواندن فایل CSV — مثال پایه
import csv
with open('data.csv', mode='r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)در این مثال با open فایل را باز میکنیم و از csv.reader استفاده میشود تا هر ردیف بهصورت لیستی از فیلدها بازگردد. نکتهٔ مهم استفاده از newline=” است که از تبدیل خودکار newline توسط open جلوگیری میکند و رفتار ماژول csv را تضمین میکند.
خواندن بهصورت دیکشنری (DictReader)
import csv
with open('people.csv', mode='r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
for row in reader:
# row یک OrderedDict یا dict است
print(row['name'], row['age'])DictReader ردیفها را با کلیدهایی که از هدر CSV استخراج شده یا از پارامتر fieldnames گرفته شده، بازمیگرداند. این روش خواندن، خوانایی کد را افزایش میدهد و برای پردازش ستونی مفید است.
نوشتن فایل CSV — مثال پایه
import csv
rows = [
['name', 'age', 'city'],
['Alice', '30', 'London'],
['Bob', '25', 'Tehran']
]
with open('out.csv', mode='w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(rows)writer.writerows(rows) تمام ردیفها را در یک فراخوانی مینویسد. باز هم استفاده از newline=” و تعیین encoding مهم است تا از خطاها یا خطوط خالی اضافی جلوگیری شود.
نوشتن با DictWriter
import csv
fieldnames = ['name', 'age', 'city']
people = [
{'name': 'Alice', 'age': 30, 'city': 'London'},
{'name': 'Bob', 'age': 25, 'city': 'Tehran'},
]
with open('people_out.csv', mode='w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(people)DictWriter برای نوشتن دیکشنریها مناسب است و اجازه میدهد هدرها را با writeheader بنویسیم. اگر ترتیب ستونها مهم است، fieldnames را صریح مشخص کنید.
پارامترهای مهم و جدول خلاصه
| پارامتر | شرح |
|---|---|
| delimiter | جداکنندهٔ فیلدها (پیشفرض: ‘,’) |
| quotechar | کاراکتر نقلقول (پیشفرض: ‘”‘) |
| escapechar | کاراکتر فرار برای مواقع خاص |
| quoting | رفتار نقلقولگذاری (مثلاً csv.QUOTE_MINIMAL) |
| skipinitialspace | حذف فاصلهٔ بعد از جداکننده |
| lineterminator | تعریف انتهای خط هنگام نوشتن |
مثال: دیالکت سفارشی و Sniffer
import csv
csv.register_dialect('semicolon', delimiter=';', quotechar='"')
with open('semi.csv', encoding='utf-8', newline='') as f:
reader = csv.reader(f, dialect='semicolon')
for r in reader:
print(r)
# تشخیص خودکار دیالکت
with open('unknown.csv', encoding='utf-8', newline='') as f:
sample = f.read(2048)
sniffer = csv.Sniffer()
dialect = sniffer.sniff(sample)
print('Delimiter detected:', dialect.delimiter)در قسمت اول یک دیالکت سفارشی با جداکنندهٔ «;» ثبت و استفاده شد. در بخش دوم از csv.Sniffer برای تشخیص خودکار جداکننده استفاده شده که در فایلهایی با فرمت نامشخص کاربرد دارد.
مدیریت Unicode، BOM و encoding
برای فایلهایی با UTF-8 یا کاراکترهای غیرلاتین، همیشه encoding را مشخص کنید (مثلاً encoding=’utf-8′) و در صورت وجود BOM از codecs یا ‘utf-8-sig’ استفاده کنید:
import csv
with open('utf_bom.csv', mode='r', encoding='utf-8-sig', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)استفاده از ‘utf-8-sig’ باعث حذف BOM از ابتدای فایل میشود و از خرابی نام ستونها جلوگیری میکند.
خطاهای رایج و بهترین شیوهها
- همیشه از newline=” هنگام باز کردن فایل برای csv استفاده کنید (مهم در پایتون 3).
- برای عملکرد بهتر در فایلهای بزرگ از buffered I/O و پردازش جفتی استفاده کنید؛ اما برای عملیات تحلیل دیتاستهای بزرگ، pandas معمولاً سریعتر و سادهتر است.
- برای دادههایی که ممکن است شامل جداکنندهها باشند، از quotechar مناسب یا escapechar استفاده کنید.
- اگر نوع دادهها مهم است (مثلاً تبدیل رشتهها به عدد)، تبدیل را بعد از خواندن انجام دهید چون csv همه چیز را بهصورت رشته بازمیگرداند.
نمونه تبدیل نوع ستون هنگام خواندن
import csv
def parse_row(row):
return {'name': row['name'], 'age': int(row['age']), 'salary': float(row['salary'])}
with open('employees.csv', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
for r in reader:
parsed = parse_row(r)
print(parsed)در این نمونه بعد از خواندن با DictReader، مقادیر رشتهای به انواع عددی تبدیل میشوند تا عملیات محاسباتی روی فیلدها ممکن گردد.
مقایسهٔ کوتاه: csv در برابر pandas
- csv: مناسب برای فایلهای ساده، سبک، و وقتی میخواهید کنترل ردیف به ردیف داشته باشید.
- pandas: مناسب برای تحلیل داده، خواندن/نوشتن سریع با پارامترهای پیشرفته، و مدیریت خودکار انواع داده و ایندکسها.
نتیجهگیری و جمعبندی
ماژول csv ابزار قابلاعتمادی برای کار با فایلهای CSV در پایتون است. با رعایت نکات سادهای مثل استفاده از newline=”، تعیین صحیح encoding و آشنایی با DictReader/DictWriter، میتوان اکثر نیازهای روزمرهٔ پردازش CSV را پوشش داد. برای پردازشهای پیچیدهتر یا دادههای حجیم، ترکیب csv با ابزارهایی مثل pandas یا استفاده از خواندن chunked توصیه میشود.
در صورت نیاز میتوانید مثالهای بیشتری (مثلاً پردازش موازی، خواندن از URL یا استریم) را نیز درخواست کنید تا کدهای پیشرفتهتر و الگوهای طراحی مرتبط ارائه شود.
آیا این مطلب برای شما مفید بود ؟




