حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش کار با فایل در پایتون؛ CSV، JSON و گزارش‌گیری

اعتبارسنجی کامل فروش CSV در پایتون؛ تاریخ، محصول و عددها

پروژه CSV به JSON با پایتون؛ گزارش فروش معتبر و قابل بازخوانی · 0٪

✍️ حالا هر ردیف خام باید از چهار شرط عبور کند: تعداد سلول درست، تاریخ واقعی با شکل دقیق ISO، محصول غیرخالی پس از strip، و عددهایی با دامنه مجاز. فقط ردیف کامل وارد خروجی نرمال‌شده می‌شود. یک ردیف خراب هرچند چند ایراد داشته باشد، یک بار در invalid_rows حساب می‌شود.

مثلاً تاریخ ناممکن 2026-02-30 رد می‌شود، حتی اگر تعداد و قیمت درست باشند. محصول « دفتر » به «دفتر» تبدیل می‌شود، ولی تاریخ فاصله‌دار را پاک‌سازی نمی‌کنیم؛ قرارداد تاریخ دقیق می‌خواهد. قیمت صفر معتبر است و تعداد صفر معتبر نیست. مقدارهایی که int قبول می‌کند، مثل عدد با فاصله دو سر، قابل تبدیل‌اند؛ اعشار رد می‌شود.

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

فعالیت شما

تابع validated_sales(text) فایل موقت CSV با header دقیق date,product,quantity,unit_price می‌سازد. خروجی {'rows':[رکوردهای معتبر نرمال‌شده به ترتیب],'invalid_rows':تعداد ردیف ردشده} باشد. تاریخ دقیق واقعی YYYY-MM-DD بدون strip، product با strip غیرخالی، quantity=int(text)>0، unit_price=int(text)>=0؛ سلول کم/اضافه نامعتبر است. خط بدون سلول یا تنها یک سلول فقط‌فاصله نادیده گرفته شود؛ ',,,' نامعتبر است. خالی/فقط header خروجی rows=[] و invalid_rows=0. هر ردیف خراب فقط یک بار شمرده شود و تکرار معتبر حفظ شود؛ 2026-01-01, دفتر ,2,0 یک رکورد دفتر با دو عدد 2 و0 است.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

import tempfile
from pathlib import Path
import csv
import json
from datetime import date

def normalize_row(cells):
    if len(cells) != 4:
        return None
    day_text, product, quantity_text, price_text = cells
    product = product.strip()
    try:
        day = date.fromisoformat(day_text)
        quantity = int(quantity_text)
        price = int(price_text)
    except ValueError:
        return None
    if day.isoformat() != day_text or not product or quantity <= 0 or price < 0:
        return None
    return {'date': day_text, 'product': product, 'quantity': quantity, 'unit_price': price}

def validated_sales(text):
    with tempfile.TemporaryDirectory() as folder:
        path = Path(folder) / 'sales.csv'
        path.write_text(text, encoding='utf-8')
        valid, invalid = [], 0
        with open(path, encoding='utf-8', newline='') as file:
            reader = csv.reader(file)
            next(reader, None)
            for cells in reader:
                # TODO: ignore empty lines, normalize or count rejection
                pass
        return {'rows': valid, 'invalid_rows': invalid}