پیش‌نیاز و هدف یادگیری

این بخش، گام 15 از مسیر «پایتون از صفر» است. هدف این درس خواندن جدول با DictReader و تبدیل صریح عددها است. پیش‌نیاز: یونیکد و translate؛ عادی‌سازی رقم‌های فارسی. کتابخانهٔ خارجی لازم نیست؛ ماژول‌های استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیش‌نیاز را بخوانید و مثالش را اجرا کنید؛ حفظ‌کردن کد جای فهم ورودی و خروجی را نمی‌گیرد.

مفهوم اصلی به زبان ساده

کتابخانهٔ استاندارد همراه خود پایتون نصب می‌شود و برای بسیاری از کارهای روزمره کافی است. ماژول csv قواعد جداکننده، کوتیشن و سطرها را مدیریت می‌کند. استفاده از split(",") برای CSV واقعی قابل اعتماد نیست؛ ممکن است نام یک کالا خودش ویرگول داشته باشد. DictReader ستون‌ها را با نامشان در اختیار ما قرار می‌دهد.

مسئلهٔ این درس

در پروژهٔ «گزارش فروش از متن CSV» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار می‌دهد؛ تابع solve دیکشنری داده را می‌گیرد و نتیجهٔ خود را برمی‌گرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.

نمونه‌کد قابل اجرا

import csv
import io

def solve(data):
    totals = {}
    for row in csv.DictReader(io.StringIO(data['csv'])):
        amount = int(row['quantity']) * float(row['price'])
        totals[row['product']] = totals.get(row['product'], 0) + amount
    return {'total': round(sum(totals.values()), 2), 'by_product': {k: round(v, 2) for k, v in totals.items()}}

print(solve({'csv': 'product,quantity,price\nbook,2,10\npen,3,2\nbook,1,5\n'}))

نتیجهٔ مورد انتظار

{
  "total": 31,
  "by_product": {
    "book": 25,
    "pen": 6
  }
}

توضیح مرحله‌به‌مرحله

متن csv ورودی را با io.StringIO به شیئی شبیه فایل تبدیل می‌کنیم؛ بنابراین به فایل بیرونی نیاز نداریم. ستون‌های product، quantity و price الزامی‌اند و داده‌های این تمرین معتبرند. مقدار سلول‌ها رشته است، پس تعداد و قیمت را به عدد تبدیل می‌کنیم. فروش هر سطر quantity ضرب در price و فروش هر محصول مجموع سطرهای همان نام است.

قرارداد ورودی و خروجی

مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرست‌ها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره می‌کند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درست‌بودن پاسخ و قبولی ارزیابی یکسان نیست.

خطای رایج و راه تشخیص

داشتن عنوان ستون بدون هیچ سطر داده خطا نیست؛ گزارش باید جمع صفر و نگاشت خالی بدهد. مقدار عددی ذخیره‌شده در CSV همچنان رشته است. اگر تبدیل را فراموش کنید، ضرب رشته در عدد صحیح متن را تکرار می‌کند و نتیجهٔ مالی نمی‌سازد.

تمرین مستقل و خودآزمایی

یک محصول تکراری و محصولی با تعداد صفر اضافه کنید. سپس نام یک محصول را داخل کوتیشن و دارای ویرگول بنویسید تا تفاوت parser استاندارد با split دستی را ببینید.

برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچک‌تر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر هم‌زمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام می‌شود و پاسخ ثابت نمونه پذیرفته نخواهد شد.

گام بعدی

موضوع‌های این درس: csv · io · DictReader. اگر می‌توانید دلیل هر خط را توضیح دهید و ورودی تازه‌ای را بدون دست‌کاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژه‌های یادگیری ماشین عجله نکنید.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.