جستوجوگر
از شما میخواهیم تابعی به نام explore بنویسید. این تابع دو ورودی دریافت میکند:
- extension: یک رشته که پسوند فایل موردنظر را مشخص میکند (مانند
"jpg"یا"txt"). - directory_path: یک رشته حاوی آدرس نسبی پوشهای که جستوجو باید از آن آغاز شود.
حال میخواهیم تعداد فایلهای با پسوند extension در هر پوشه شمرده شود. بنابراین این تابع باید پوشهی مشخصشده (directory_path) و تمام زیرپوشههای آن را پیمایش کند و فایلهایی با پسوند دادهشده (extension) را پیدا کند. تابع باید یک دیکشنری برگرداند که ساختار آن به شرح زیر است:
- کلیدها: آدرسهای نسبی پوشههایی (نسبت به محل اجرای اسکریپت پایتون) که حداقل یک فایل با پسوند موردنظر مستقیماً در آنها یافت شدهاست.
- مقدارها: تعداد فایلهایی که پسوندشان با extension مطابقت دارد و مستقیماً در پوشهی متناظر با کلید قرار دارند.
- پوشههایی که هیچ فایلی با پسوند موردنظر در آنها (و نه در زیرپوشههایشان) وجود ندارد، نباید در دیکشنری خروجی گنجانده شوند.
- مقایسهی پسوند فایل باید بدون در نظر گرفتن بزرگی یا کوچکی حروف انجام شود. برای مثال، فایل
image.jpegبا پسوندjpegیاJpEgمطابقت دارد.
🎯 مثال
فرض کنید ساختار پوشهها و فایلها بهصورت زیر باشد. اسکریپت main.py در پوشهی source قرار دارد.
.
├── 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 باید نتایج زیر را تولید کند:
>>> explore("jpg", "../test_media")
{'../test_media': 1, '../test_media/travel_photos': 3}
(فایل IMG_2235.jpg در test_media و سه فایل jpg در travel_photos)
>>> explore("txt", "../test_media/travel_photos")
{'../test_media/travel_photos': 1}
(فایل note.tXt در travel_photos)
>>> explore("mkv", "../test_media")
{}
(هیچ فایل mkv در هیچ پوشهای وجود ندارد)
💡 چالشهای حل تمرین
⚠️ چگونه تطابق پسوند را بررسی کنم؟
پسوند همواره باید بعد از
.قرار گیرد. اگر فایلی با پسوند ورودی تابع تمام شود اما پیش از آن نقطه قرار نگرفته باشد، نباید در پاسخ شمرده شود. برای مثال، برای پسوند ورودیpng، ممکن است فایلی به نامqPNGرا بیابید؛ اما این فایل دارای پسوند موردنظر نیست و ممکن است یک فایل متنی ساده و بدون پسوند باشد.همچنین فراموش نکنید که بررسی تطابق پسوند باید بدون توجه به بزرگی و کوچکی حروف انجام شود.
⚠️ شمارش بهدرستی انجام میشود؛ چرا پاسخم پذیرفته نیست؟
دیکشنری خروجی خود را بررسی کنید. اگر در یک پوشه هیچ فایلی با پسوند موردنظر وجود نداشت، نباید کلید متناظر با آن پوشه در دیکشنری قرار گیرد (با مقدار ۰).
💡 راهنمایی نهایی
ساختار کلی تابع به این شکل است:
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"){}برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود