سطح مقدماتی (Beginner Level)
فایلهای CSV (Comma Separated Values) یکی از رایجترین فرمتها برای ذخیره و انتقال دادههای متنی ساختاریافته هستند. پایتون به صورت پیشفرض کتابخانهای به نام csv دارد که کار با این فایلها را بسیار ساده میکند.
۱. خواندن فایل CSV (Reading)
برای خواندن فایل، ابتدا آن را با تابع open باز میکنیم و سپس از csv.reader استفاده میکنیم. این متد خطوط فایل را به صورت لیستی از رشتهها برمیگرداند.
مثال ۱: خواندن ساده سطر به سطر
در این مثال فرض میکنیم فایلی به نام data.csv وجود دارد.
# Static: Requires an external 'data.csv' file
import csv
# باز کردن فایل در حالت خواندن (r)
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
# پیمایش روی سطرها
for row in reader:
print(row)
# خروجی احتمالی: ['Name', 'Age', 'City']
مثال ۲: شبیهسازی خواندن (قابل اجرا)
برای درک بهتر، در اینجا از ماژول io استفاده میکنیم تا یک فایل CSV را در حافظه شبیهسازی کنیم و آن را بخوانیم.
۲. نوشتن در فایل CSV (Writing)
برای ایجاد یا ویرایش فایل CSV، از csv.writer استفاده میشود. دو متد اصلی وجود دارد:
writerow(): نوشتن یک سطر (یک لیست).writerows(): نوشتن چندین سطر به صورت همزمان.
نکته مهم: هنگام باز کردن فایل در ویندوز، حتماً از آرگومان newline='' استفاده کنید تا از ایجاد سطرهای خالی اضافی جلوگیری شود.
# Static: Writing to a file system
import csv
data = [
['Name', 'Job', 'Experience'],
['Mohammad', 'Developer', '5 Years'],
['Narges', 'Designer', '3 Years']
]
with open('employees.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
# نوشتن هدر (سرستون)
writer.writerow(['Name', 'Job', 'Experience'])
# نوشتن دادهها (چند سطر با هم)
writer.writerows(data[1:])
سطح پیشرفته (Professional Level)
در پروژههای واقعی، دادهها پیچیدهتر هستند و نیاز به نگاشت دادهها به دیکشنری، مدیریت کاراکترهای خاص (مثل فارسی) و فرمتهای غیرستاندار وجود دارد.
۱. استفاده از DictReader و DictWriter
این کلاسها سطرهای CSV را مستقیماً به دیکشنری (Dictionary) تبدیل میکنند. کلیدهای دیکشنری همان هدر (Header) فایل خواهند بود. این روش خوانایی کد را به شدت افزایش میدهد.
مثال ۱: خواندن به صورت دیکشنری
مثال ۲: نوشتن دیکشنری در CSV
# Static: Writing dictionaries to CSV
import csv
fieldnames = ['first_name', 'last_name']
rows = [
{'first_name': 'Ali', 'last_name': 'Alavi'},
{'first_name': 'Reza', 'last_name': 'Razavi'},
]
with open('names.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # نوشتن تیتر ستونها
writer.writerows(rows)
۲. مدیریت Dialect و Delimiter های خاص
همه فایلهای CSV با کاما (,) جدا نمیشوند. گاهی جداکننده tab (\t) یا semicolon (;) است. با پارامتر delimiter یا تعریف dialect میتوان این موارد را مدیریت کرد.
۳. نکات حیاتی Encoding (فارسی و اکسل)
اگر میخواهید فایل CSV خروجی را در اکسل (Excel) باز کنید و متون فارسی درست نمایش داده شوند، باید از انکودینگ utf-8-sig استفاده کنید. این انکودینگ BOM (Byte Order Mark) را به ابتدای فایل اضافه میکند تا اکسل بفهمد فایل UTF-8 است.
# Static: Correct encoding for Persian/Excel support
import csv
data = [['نام', 'سن'], ['علی', '۲۵'], ['سارا', '۳۰']]
# استفاده از utf-8-sig برای پشتیبانی صحیح اکسل از فارسی
with open('persian_data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerows(data)
۴. چالشهای امنیتی (CSV Injection)
اگر دادههای CSV از ورودی کاربر گرفته میشوند و قرار است در اکسل باز شوند، مراقب کاراکترهایی که با =، +، - یا @ شروع میشوند باشید. اکسل ممکن است آنها را به عنوان فرمول اجرا کند.