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

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

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

مسیر فایل را نباید با بریدن دستی رشته در محل نقطه یا اسلش تفسیر کرد. pathlib ابزار استاندارد پایتون برای کار با مسیرهاست. Path برای کار واقعی با فایل‌سیستم و PurePosixPath برای پردازش نحوی مسیرهای سبک لینوکس استفاده می‌شود. تمرین حاضر فقط نام‌ها را بررسی می‌کند و هیچ فایلی باز، حذف یا جابه‌جا نمی‌کند.

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

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

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

from pathlib import PurePosixPath

def solve(data):
    counts = {}
    for name in data['names']:
        suffix = PurePosixPath(name).suffix.lower() or '[none]'
        counts[suffix] = counts.get(suffix, 0) + 1
    return {'extensions': counts}

print(solve({'names': ['a.TXT', 'b.txt', 'archive.tar.gz', 'README']}))

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

{
  "extensions": {
    ".txt": 2,
    ".gz": 1,
    "[none]": 1
  }
}

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

برای هر نام ورودی، یک PurePosixPath می‌سازیم و suffix را می‌خوانیم. پسوند را به حروف کوچک تبدیل می‌کنیم تا .TXT و .txt در یک گروه باشند. فایل بدون پسوند در گروه [none] قرار می‌گیرد. در archive.tar.gz پسوند نهایی .gz است، نه .tar.gz؛ برای همهٔ پسوندها ابزار suffixes وجود دارد، ولی قرارداد این پروژه فقط آخرین پسوند را می‌خواهد.

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

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

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

ساختن یک شیء مسیر به معنی امن‌بودن آن برای خواندن روی سرور نیست. مسیر دریافتی از کاربر برای دسترسی واقعی به دیسک به محدودیت پوشه و بررسی جدا نیاز دارد. اینجا عمداً فقط متن مسیر را تحلیل می‌کنیم تا هیچ دسترسی بیرونی لازم نباشد.

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

نام report.CSV، archive.tar.gz، README و فایل مخفی .env.example را از نظر آخرین پسوند مقایسه کنید. برای تمرین فقط نام ساختگی بنویسید و محتوای فایل حساس را نخوانید.

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

گام بعدی

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

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

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