ویژگی تصویر

معرفی کتابخانه csv در پایتون

  /  پایتون   /  کتابخانه 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 یا استریم) را نیز درخواست کنید تا کدهای پیشرفته‌تر و الگوهای طراحی مرتبط ارائه شود.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: