🐍 کتابخانه مرجع پایتون

📊 کار با 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()
⏳ برای اجرا دکمه را بزنید...

📌 نکات کلیدی

← قبلی: کار با JSON → بعدی: مبانی NumPy ↑ بازگشت به فهرست متوسط