راه
۶ کیو· متوسطمتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

جست‌وجوگر

از شما می‌خواهیم تابعی به نام explore بنویسید. این تابع دو ورودی دریافت می‌کند:

  • extension: یک رشته که پسوند فایل موردنظر را مشخص می‌کند (مانند "jpg" یا "txt").
  • directory_path: یک رشته حاوی آدرس نسبی پوشه‌ای که جست‌وجو باید از آن آغاز شود.

حال می‌خواهیم تعداد فایل‌های با پسوند extension در هر پوشه شمرده شود. بنابراین این تابع باید پوشه‌ی مشخص‌شده (directory_path) و تمام زیرپوشه‌های آن را پیمایش کند و فایل‌هایی با پسوند داده‌شده (extension) را پیدا کند. تابع باید یک دیکشنری برگرداند که ساختار آن به شرح زیر است:

  • کلیدها: آدرس‌های نسبی پوشه‌هایی (نسبت به محل اجرای اسکریپت پایتون) که حداقل یک فایل با پسوند موردنظر مستقیماً در آن‌ها یافت شده‌است.
  • مقدارها: تعداد فایل‌هایی که پسوندشان با extension مطابقت دارد و مستقیماً در پوشه‌ی متناظر با کلید قرار دارند.
  • پوشه‌هایی که هیچ فایلی با پسوند موردنظر در آن‌ها (و نه در زیرپوشه‌هایشان) وجود ندارد، نباید در دیکشنری خروجی گنجانده شوند.
  • مقایسه‌ی پسوند فایل باید بدون در نظر گرفتن بزرگی یا کوچکی حروف انجام شود. برای مثال، فایل image.jpeg با پسوند jpeg یا JpEg مطابقت دارد.

🎯 مثال

فرض کنید ساختار پوشه‌ها و فایل‌ها به‌صورت زیر باشد. اسکریپت main.py در پوشه‌ی source قرار دارد.

text
.
├── source
│   └── main.py
│
└── test_media
    ├── IMG_2235.jpg
    ├── travel_photos
    │   ├── 2018-11-09_11-27-14.3gP
    │   ├── IMG_20171017_052418.jpg
    │   ├── 20180311_214539.JPG
    │   ├── IMG_2237.jpg
    │   └── note.tXt
    └── vid1
        ├── images
        │   └── JPG
        └── VID_20170425_184731.mp4

فراخوانی تابع explore در اسکریپت main.py باید نتایج زیر را تولید کند:

text
>>> explore("jpg", "../test_media")
{'../test_media': 1, '../test_media/travel_photos': 3}

(فایل IMG_2235.jpg در test_media و سه فایل jpg در travel_photos)

text
>>> explore("txt", "../test_media/travel_photos")
{'../test_media/travel_photos': 1}

(فایل note.tXt در travel_photos)

text
>>> explore("mkv", "../test_media")
{}

(هیچ فایل mkv در هیچ پوشه‌ای وجود ندارد)


💡 چالش‌های حل تمرین

⚠️ چگونه تطابق پسوند را بررسی کنم؟

پسوند همواره باید بعد از . قرار گیرد. اگر فایلی با پسوند ورودی تابع تمام شود اما پیش از آن نقطه قرار نگرفته باشد، نباید در پاسخ شمرده شود. برای مثال، برای پسوند ورودی png، ممکن است فایلی به نام qPNG را بیابید؛ اما این فایل دارای پسوند موردنظر نیست و ممکن است یک فایل متنی ساده و بدون پسوند باشد.

هم‌چنین فراموش نکنید که بررسی تطابق پسوند باید بدون توجه به بزرگی و کوچکی حروف انجام شود.

⚠️ شمارش به‌درستی انجام می‌شود؛ چرا پاسخم پذیرفته نیست؟

دیکشنری خروجی خود را بررسی کنید. اگر در یک پوشه هیچ فایلی با پسوند موردنظر وجود نداشت، نباید کلید متناظر با آن پوشه در دیکشنری قرار گیرد (با مقدار ۰).


💡 راهنمایی نهایی

ساختار کلی تابع به این شکل است:

python
import os

def explore(extension, directory_path):
    extension = extension.lower()
    result = {}

    for root, dirs, files in os.walk(directory_path):
        count = 0
        for file in files:
            if '.' in file and file.lower().endswith('.' + extension):
                count += 1
        if count > 0:
            result[root] = count

    return result
  • os.walk(directory_path) ← پیمایش تمام پوشه‌ها و زیرپوشه‌ها
  • file.lower().endswith('.' + extension) ← بررسی تطابق پسوند (بدون توجه به بزرگی/کوچکی حروف)
  • '.' in file ← اطمینان از وجود نقطه قبل از پسوند
  • count ← شمارش فایل‌های منطبق در هر پوشه
  • if count > 0 ← فقط پوشه‌هایی که حداقل یک فایل دارند در خروجی قرار می‌گیرند
  • result[root] = count ← ذخیره مسیر پوشه به‌عنوان کلید و تعداد به‌عنوان مقدار

✅ این تمرین را در ویرایشگر خود پیاده‌سازی کنید. به یاد داشته باشید که تابع باید یک دیکشنری برگرداند و مسیرهای کلیدها باید نسبی باشند (همان‌طور که os.walk برمی‌گرداند).

نمونه‌ها

ورودی نمونه ۱
explore("jpg", "../test_media")
خروجی نمونه ۱
{'../test_media': 1, '../test_media/travel_photos': 3}
ورودی نمونه ۲
explore("txt", "../test_media/travel_photos")
خروجی نمونه ۲
{'../test_media/travel_photos': 1}
ورودی نمونه ۳
explore("mkv", "../test_media")
خروجی نمونه ۳
{}

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود