📊 کار با CSV در پایتون
CSV (Comma-Separated Values) یکی از رایجترین فرمتها برای ذخیره و تبادل دادههای جدولی است.
پایتون با ماژول csv امکانات کاملی برای خواندن و نوشتن فایلهای CSV فراهم میکند.
این مهارت برای تحلیل داده، مهندسی داده و کار با دیتابیسها بسیار ضروری است.
🔹 نوشتن CSV با csv.writer
import csv
# دادههای نمونه
data = [
["Name", "Age", "City", "Score"],
["Saba", 22, "Tehran", 18.5],
["Ali", 24, "Shiraz", 19.0],
["Reza", 20, "Isfahan", 17.5],
["Mina", 23, "Tehran", 20.0]
]
# نوشتن در فایل CSV
with open("students.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(data)
print("CSV file 'students.csv' created successfully!")
⏳ برای اجرا دکمه را بزنید...
🔹 خواندن CSV با csv.reader
import csv
# ابتدا فایل CSV را ایجاد میکنیم
data = [
["Name", "Age", "City", "Score"],
["Saba", 22, "Tehran", 18.5],
["Ali", 24, "Shiraz", 19.0],
["Reza", 20, "Isfahan", 17.5],
["Mina", 23, "Tehran", 20.0]
]
with open("students.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(data)
# خواندن فایل CSV
with open("students.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
print("CSV Content:")
for row in reader:
print(row)
# خواندن با دسترسی به هدر
with open("students.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
header = next(reader) # خواندن خط اول به عنوان هدر
print(f"\nHeader: {header}")
print("Data:")
for row in reader:
print(f" {row}")
⏳ برای اجرا دکمه را بزنید...
🔹 نوشتن CSV با csv.DictWriter
با DictWriter میتوانید از دیکشنریها برای نوشتن استفاده کنید.
import csv
# داده به صورت لیست دیکشنری
students = [
{"name": "Saba", "age": 22, "city": "Tehran", "score": 18.5},
{"name": "Ali", "age": 24, "city": "Shiraz", "score": 19.0},
{"name": "Reza", "age": 20, "city": "Isfahan", "score": 17.5}
]
# نوشتن با DictWriter
with open("students_dict.csv", "w", newline="", encoding="utf-8") as file:
fieldnames = ["name", "age", "city", "score"]
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # نوشتن هدر
writer.writerows(students) # نوشتن دادهها
print("CSV with DictWriter created!")
⏳ برای اجرا دکمه را بزنید...
🔹 خواندن CSV با csv.DictReader
با DictReader میتوانید به دادهها به صورت دیکشنری دسترسی داشته باشید.
import csv
# ایجاد فایل CSV با DictWriter
students = [
{"name": "Saba", "age": 22, "city": "Tehran", "score": 18.5},
{"name": "Ali", "age": 24, "city": "Shiraz", "score": 19.0},
{"name": "Reza", "age": 20, "city": "Isfahan", "score": 17.5}
]
with open("students_dict.csv", "w", newline="", encoding="utf-8") as file:
fieldnames = ["name", "age", "city", "score"]
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(students)
# خواندن با DictReader
with open("students_dict.csv", "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
print("Data as dictionaries:")
for row in reader:
print(f" {row['name']} is {row['age']} years old from {row['city']} (Score: {row['score']})")
# محاسبه میانگین نمرات
with open("students_dict.csv", "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
scores = [float(row["score"]) for row in reader]
average = sum(scores) / len(scores)
print(f"\nAverage score: {average:.2f}")
⏳ برای اجرا دکمه را بزنید...
🔹 سفارشیسازی جداکننده (delimiter)
میتوانید از جداکنندههای دیگری مثل ; یا \t استفاده کنید.
import csv
data = [
["Name", "Age", "City"],
["Saba", 22, "Tehran"],
["Ali", 24, "Shiraz"]
]
# نوشتن با جداکننده نقطهویرگول
with open("students_semicolon.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, delimiter=";")
writer.writerows(data)
# خواندن با جداکننده نقطهویرگول
with open("students_semicolon.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file, delimiter=";")
print("Data with semicolon separator:")
for row in reader:
print(row)
# نوشتن با جداکننده تب (TSV)
with open("students_tsv.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, delimiter="\t")
writer.writerows(data)
# خواندن TSV
with open("students_tsv.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file, delimiter="\t")
print("\nData with tab separator:")
for row in reader:
print(row)
⏳ برای اجرا دکمه را بزنید...
🔹 کار با نقل قولها
پارامتر quoting نحوه استفاده از نقل قول را کنترل میکند.
import csv
data = [
["Name", "Description"],
["Saba", "Loves Python, AI, and Data Science"],
["Ali", 'Works at "Tech Company"']
]
# نوشتن با نقل قولهای ضروری
with open("students_quote.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL)
writer.writerows(data)
# نمایش محتوا
with open("students_quote.csv", "r", encoding="utf-8") as file:
content = file.read()
print("QUOTE_MINIMAL:")
print(content)
# QUOTE_NONNUMERIC: نقل قول برای غیر عددیها
with open("students_quote_nonnum.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC)
writer.writerows(data)
# QUOTE_ALL: نقل قول برای همه
with open("students_quote_all.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file, quoting=csv.QUOTE_ALL)
writer.writerows(data)
# نمایش محتوا
with open("students_quote_all.csv", "r", encoding="utf-8") as file:
content = file.read()
print("\nQUOTE_ALL:")
print(content)
⏳ برای اجرا دکمه را بزنید...
🔹 خواندن CSV با Pandas (مقدماتی)
پانداس ابزار قدرتمندی برای کار با CSV است و در محیطهای واقعی (نه Pyodide) به راحتی قابل استفاده است.
import pandas as pd
# ایجاد فایل CSV نمونه (با استفاده از pandas)
data = {
"Name": ["Saba", "Ali", "Reza", "Mina"],
"Age": [22, 24, 20, 23],
"City": ["Tehran", "Shiraz", "Isfahan", "Tehran"],
"Score": [18.5, 19.0, 17.5, 20.0]
}
df = pd.DataFrame(data)
# ذخیره در CSV
df.to_csv("students_pandas.csv", index=False)
# خواندن از CSV
df_loaded = pd.read_csv("students_pandas.csv")
print("DataFrame from Pandas:")
print(df_loaded)
# نمایش اطلاعات
print("\nDataFrame info:")
print(f"Shape: {df_loaded.shape}")
print(f"Columns: {df_loaded.columns.tolist()}")
print(f"Average score: {df_loaded['Score'].mean():.2f}")
# فیلتر کردن
tehran_students = df_loaded[df_loaded["City"] == "Tehran"]
print(f"\nStudents from Tehran:\n{tehran_students}")
🔹 مدیریت خطا در CSV
import csv
# فایل CSV با خطا
invalid_csv = """Name,Age,City
Saba,Tehran,22
Ali,24,Shiraz
Reza,20,Isfahan
"""
# نوشتن فایل با خطا
with open("invalid.csv", "w", encoding="utf-8") as file:
file.write(invalid_csv)
# خواندن با مدیریت خطا
try:
with open("invalid.csv", "r", encoding="utf-8") as file:
reader = csv.reader(file)
for row in reader:
print(row)
except csv.Error as e:
print(f"CSV Error: {e}")
except FileNotFoundError:
print("File not found!")
except Exception as e:
print(f"An error occurred: {e}")
# راهحل: خواندن به صورت دستی
print("\nManual reading:")
with open("invalid.csv", "r", encoding="utf-8") as file:
for line in file:
parts = line.strip().split(",")
print(parts)
⏳ برای اجرا دکمه را بزنید...
🔹 نمونه CSV پیچیده
import csv
# دادههای فروش
sales_data = [
["Product", "Category", "Price", "Quantity", "Date"],
["Laptop", "Electronics", 1200, 10, "2024-01-15"],
["Phone", "Electronics", 800, 25, "2024-01-16"],
["Tablet", "Electronics", 500, 15, "2024-01-17"],
["Book", "Stationery", 25, 100, "2024-01-18"],
["Pen", "Stationery", 5, 500, "2024-01-19"],
["Monitor", "Electronics", 300, 8, "2024-01-20"]
]
with open("sales.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(sales_data)
# تحلیل داده
with open("sales.csv", "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
sales = list(reader)
# محاسبه مجموع فروش هر محصول
total_revenue = 0
category_revenue = {}
for item in sales:
price = float(item["Price"])
quantity = int(item["Quantity"])
revenue = price * quantity
total_revenue += revenue
category = item["Category"]
category_revenue[category] = category_revenue.get(category, 0) + revenue
print("Sales Analysis:")
print(f"Total revenue: ${total_revenue:,.2f}")
print("\nRevenue by category:")
for category, revenue in category_revenue.items():
print(f" {category}: ${revenue:,.2f}")
# میانگین قیمت محصولات
avg_price = sum(float(item["Price"]) for item in sales) / len(sales)
print(f"\nAverage product price: ${avg_price:.2f}")
⏳ برای اجرا دکمه را بزنید...
🔹 مثال جامع: سیستم مدیریت دانشجویان
import csv
import os
class StudentManager:
def __init__(self, filename="students_data.csv"):
self.filename = filename
self.students = self.load_students()
def load_students(self):
"""بارگذاری دانشجویان از فایل CSV"""
students = []
if os.path.exists(self.filename):
with open(self.filename, "r", encoding="utf-8") as file:
reader = csv.DictReader(file)
for row in reader:
row["age"] = int(row["age"])
row["score"] = float(row["score"])
students.append(row)
print(f"Loaded {len(students)} students from {self.filename}")
else:
# دادههای پیشفرض
students = [
{"name": "Saba", "age": 22, "city": "Tehran", "score": 18.5},
{"name": "Ali", "age": 24, "city": "Shiraz", "score": 19.0},
{"name": "Reza", "age": 20, "city": "Isfahan", "score": 17.5}
]
return students
def save_students(self):
"""ذخیره دانشجویان در فایل CSV"""
with open(self.filename, "w", newline="", encoding="utf-8") as file:
fieldnames = ["name", "age", "city", "score"]
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(self.students)
print(f"Saved {len(self.students)} students to {self.filename}")
def add_student(self, name, age, city, score):
"""افزودن دانشجو جدید"""
student = {"name": name, "age": age, "city": city, "score": score}
self.students.append(student)
self.save_students()
print(f"Student {name} added successfully!")
def search_by_city(self, city):
"""جستجوی دانشجویان بر اساس شهر"""
results = [s for s in self.students if s["city"].lower() == city.lower()]
return results
def get_average_score(self):
"""محاسبه میانگین نمرات"""
if not self.students:
return 0
return sum(s["score"] for s in self.students) / len(self.students)
def show_students(self):
"""نمایش همه دانشجویان"""
if not self.students:
print("No students found.")
return
print("\n--- Student List ---")
for s in self.students:
print(f"{s['name']} ({s['age']}) from {s['city']} - Score: {s['score']}")
print(f"Average score: {self.get_average_score():.2f}")
print("---\n")
# استفاده
manager = StudentManager()
# نمایش دانشجویان
manager.show_students()
# اضافه کردن دانشجو
manager.add_student("Mina", 23, "Tehran", 20.0)
# جستجو
tehran_students = manager.search_by_city("Tehran")
print(f"Students from Tehran: {[s['name'] for s in tehran_students]}")
# نمایش لیست نهایی
manager.show_students()
⏳ برای اجرا دکمه را بزنید...
📌 نکات کلیدی
- ✅ ماژول
csvبرای کار با فایلهای CSV استفاده میشود. - ✅
csv.readerوcsv.writerبرای خواندن و نوشتن ساده. - ✅
csv.DictReaderوcsv.DictWriterبرای کار با دیکشنریها. - ✅ پارامتر
delimiterبرای تغییر جداکننده (مثل;یا\t). - ✅ پارامتر
quotingبرای کنترل نقل قولها. - ✅
newline=""برای جلوگیری از خطوط اضافی در ویندوز. - ✅ Pandas ابزار قدرتمندتری برای کار با CSV است.
- ✅ CSV در تحلیل داده، مهندسی داده و تبادل اطلاعات کاربرد گسترده دارد.