در مطلب های کار با فایل ها در پایتون بخش یکم و دوم، چگونگی خواندن و نوشتن فایل های متنی و دودویی را توضیح داده ایم. در این مطلب می خواهیم در مورد شمارش و پیدا کردن تعداد واژگان درون یک فایل متنی صحبت کنیم. به طور مثال می خواهیم فهرست یا تعداد تمامی واژگان، فهرست یا تعداد یک یا چندین واژه خاص، کدام واژه بیشترین تکرار را داشته است را پیدا کنیم. به روش های متفاوتی می توانیم واژه های درون یک فایل را  پیدا کنیم. 

فرض می کنیم یک فایل متنی ساده داریم و می خواهیم تمامی واژه های این فایل را پیدا کنیم برای این کار ابتدا باید فایل را توسط تابع ()open باز کنیم سپس در یک حلقه for هر خط از فایل را می خوانیم. قطعه کد زیر مثالی از شمارش تمامی واژه های درون را نشان می دهد. در ابتدا یک فایل متنی توسط تابع ()oepn باز و سپس در یک حلقه for خط به خط خوانده می شود. سپس توسط تابع ‌‌()rstrip تمامی خطوط خالی (فضای خالی بعد هر خط یا به عبارت دیگر فضای خالی سمت راست هر خط) از فایل حذف می شوند.

در خطوط ۱۱ و ۱۲ و ۱۳ از کد بالا ابتدا در شرط if و توسط دستور ()line.split هر واژه درون هر خط، پیدا شده و سپس  یک لیست از واژه های درون یک خط مانند مثال زیر برگشت داده می شود. سپس در خط ۱۲ هر لیست پیمایش شده و تمامی واژه های درون یک متغیر به نام words از نوع لیست اضافه می شوند. کد زیر یک لیست نمونه از اجرای خط ۱۱ را نشان می دهد که تمامی واژه های یک خط، به جز فضای خالی (space یا tab) در این لیست وجود دارند.

کاربرد تابع split در پایتون

تنها مطلبی که لازم است برای کد بالا (تابع findAllWordsCount) گفته شود این است که در خطوط ۹ تا ۱۲ بررسی می شود که آیا کلیدی مطابق با یک واژه در دیشکنری از پیش وجود دارد یا نه؟ اگر وجود داشته باشد، پس باید یک واحد به مقدار آن کلید اضافه شود، در غیر این صورت، به یک واژه جدید رسیده ایم، پس باید آن واژه را فعلا به عنوان کلید و با مقدار یک واحد به درون دیکشنری اضافه کنیم. در خط ۲۰ تعداد تکرار واژه program را می خواهیم نشان دهیم.

تابع ()strip

در کد بالا به دنبال یک تک رشته در میان همه رشته های درون یک فایل متنی بودیم و همچنین تابع ()rstrip را آموزش دادیم که یک دسته از کاراکترها را از سمت راست (پایان) یک رشته پاک می کند. به طور کلی، در تابع های ()strip و ()lstrip و ()rstrip اگر هیچ ورودی به آنها داده نوشد، به ترتیب فضاهای خالی را از دو سوی چو و راست، از سوی چپ و از سوی راست یک رشته پاک می کنند.

در دومین خط، چون هیچ پارامتری به ()strip فرستاده نشده، پس همه فضاهای آغازین و پایانی رشته پاک می شوند ولی در خط ششم، چون یک فضای خالی، کاراکترهای w.com به تابع ()strip فرستاده شده اند، پس همه فضاهای خالی و همه کاراکترهای w و نقطه و c و o و m از آغاز و پایان رشته پاک می شوند. شکل زیر خروجی سه بار فراخوانی ()strip برای سه رشته را نشان می دهد. می بینید که در سومین فراخوانی،چون آغاز رشته http و پایان رشته b است، پس عملا کاراکترهای w.com فرستاده شده به ()strip چیزی را پاک نمی کنند.

در کد زیر می خواهیم شمار یک لیست از واژه ها را در خط های یک فایل متنی پیدا کنیم و در آن از هر دو تابع ()split و ()strip کمک گرفته ایم. تابع دو پارامتر را دریافت می کند که پارامتر یکم نام فایل متنی و دومین پارامتر لیستی از رشته های واژگان دلخواه ما است که می خواهیم درون رشته به دنبال آن ها بگردیم و شمار (تعداد) آنها را برگشت دهیم.

فایل متغیر filename باز شده و سپس همه خط های آن به کمک متد ()realines خوانده شده و در متغیر read نگهداری می شوند. متغیر read یک لیست از المان های رشته ای است که هر کدام از این رشته ها به یکی از خط های فایل اشاره دارند. سپس توصیفگر فایل بسته شده و در یک حلقه for و تا زمانی که به پایان لیست listwordsنرسیده ایم، به کمک تابع ()lower  همه واژاگان لیست ورودی به تابع، به حرف کوچک تبدیل می شوند. سپس یک متغیر count، بیرون دومین حلقه for ساخته می شود.

حال می خواهیم هر المان متغیر read که هر خط  از فایل است را به واژگان بشکنیم و چون در هر خط هر واژه دست کم با یک فاصله از دیگری جدا شده است، پس تابع ()split فراخوانی می شود، پس در اینجا line متغیری از گونه لیست است که هر عنصر آن، واژه های خطی از است که اکنون خوانده شده است. سپس در سومین for و به ازای هر واژه درون line، همه واژه به حرف کوچک تبدیل شده و سپس همه کاراکترهای ~!#$%^&*()_+` از دو سوی آن حذف می شوند. سپس بررسی می شود که آیا مقدار متغیر lower که یکی از المان های لیست ورودی به تابع است با واژه ای از خط کنونی برابر است یا نه؟ برای این تابع ()lower را برای تبدیل به حروف کوچک به کار بردیم، زیرا پایتون بین حروف کوچک و بزرگ تفاوت می گذارد. پس از یک لیست از واژه های دلخواه را ساخته و سپس نام و مسیر فایل در آرگومان یکم و نام این لیست در آرگومان دوم به تابع فرستاده شده اند.

دانلود اسکریپت