Deadmarshal

لینوکس و برنامه نویسی

Deadmarshal

لینوکس و برنامه نویسی

یافتن فایل های تکراری در پایتون

يكشنبه, ۲۹ بهمن ۱۳۹۶، ۰۲:۱۶ ب.ظ

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

برنامه یک پوشه یا چندین پوشه را برای بررسی دریافت می کند، بعد داخل مسیرهای داده شده رفته و فایل ها یا پوشه های تکراری را پیدا خواهد کرد.

این برنامه برای هر فایل hash حساب می کند، که به ما اجازه یافتن فایل های تکراری را حتی وقتی نام های آنها متفاوت باشند را می دهد. تمام فایل های یافت شده در یک دیکشنری، با hash به عنوان کلید، و مسیر فایل به عنوان ارزش، ذخیره خواهند شد:

{ hash: [list of paths] }

برای شروع کتابخانه های sys، os و hashlib را وارد کنید:

pyduplicate1

بعد به یک تابع برای محاسبه MD5 hash فایل نیاز داریم. این تابع مسیر فایل را دریافت و خلاصه HEX فایل را بر می گرداند:

حال به یک تابع برای بررسی مسیر فایل های تکراری نیاز داریم:

تابع findDup از os.walk برای پیمودن مسیر استفاده می شود. اگر توضیحات بیشتری درباره این تابع می خواهید، یک نگاهی به مقاله "چطور در مسیر درختی توسط پایتون پیمایش کنیم" بیاندازید. تابع os.walk فقط نام فایل را بر می گرداند، پس از os.path.join برای گرفتن مسیر کامل فایل استفاده می کنیم. بعد hash فایل را گرفته و در دیکشنری dups ذخیره می نماییم.

وقتی پیمودن مسیر ها توسط findDup تمام شد، یک دیکشنری با فایل های تکراری بر می گرداند. اگر می خواهیم مسیر را بپیماییم، به روشی برای مخطور کردن دو دیکشنری نیاز داریم:

joinDicts دو دیکشنری را می پذیرد، در دیکشنری دوم می پیماید و چک می کند که آیا کلید در دیکشنری اول وجود دارد یا خیر، اگر وجود داشت، دو ارزش را در دیکشنری دوم با آنهایی که در دیکشنری اول بودند ادغام می کند. اگر کلید وجود نداشت، در دیکشنری اول آن را ذخیره می نماید. در آخر کار، دیکشنری اول حاوی تمام اطلاعات است.

برای اینکه بتوانیم اسکریپت را از خط فرمان اجرا کنیم، باید پوشه ها را به عنوان پارامتر دریافت کنیم، و بعد findDup را برای هر پوشه صدا بزنیم:

تابع os.path.exists مطمئن می شود که پوشه داده شده در فایل های سیستم وجود دارد. برای اجرای این اسکریپت از 

dupFinder.py /folder1 ./folder2

استفاده کنید. و در آخر به متد (method) برای چاپ نتایج نیاز داریم:

کد تکمیل شده:

منبع: لینک

۰ نظر موافقین ۰ مخالفین ۰ ۲۹ بهمن ۹۶ ، ۱۴:۱۶
Ali M

مقدمه کلاس های پایتون (قسمت 1 از 2)

پنجشنبه, ۱۵ مرداد ۱۳۹۴، ۱۱:۳۷ ق.ظ

کلاس ها1 راهی برای گروه بندی تکه داده های مرتبط به یکدیگر در یک واحد (همچنین معروف به شیء2) است، با توابع3 که می توانند برای دستکاری شیء ها صدا زده شوند. برای مثال؛ اگر میخواهید اطلاعات درباره یک شخص را پیگیری کنید، شاید باید نام، آدرس و شماره تلفن او را در یک واحد قابل دستکاری ثبت کنید. 

پایتون روشی ناشیانه برای سروکار داشتن با کلاس ها دارد، پس حتی اگر با زبان های برنامه نویسی شیء گرا مانند جاوا و ++C نیز آشنایی داشته باشید، از آنجایی که تفاوت هایی در پایتون وجود دارد باید به نکات ضریفی توجه کنید.

قبل از شروع مهمه که تفاوت بین کلاس و شیء را بدانیم. یک کلاس توضیحی از این است که چیز ها چگونه باید به نظر برسند، کدام متغیر ها دسته بندی میشوند و کدام توابع باید برای سروکله زدن با آن متغیر ها صدا زده شوند. با استفاده از این توضیح، پایتون می تواند چندین نمونه کلاس (یا شیء) را بسازد، که هرکدام به صورت جداگانه می توانند دست کاری شوند. به کلاس ها به صورت یک چاقوی کلوچه نگاه کنید - خودش کلوچه نیست، اما توضیحی از این است که کلوچه چه شکلی باشد، و از آن چاقو برای ساخت کلوچه های مستقل میتوان استفاده کرد، که هر کدام از اون کلوچه ها را میتوانیم بخوریم! 


تعیین یک کلاس پایتون

بیایید با تعیین یک کلاس شروع کنیم:

نام کلاس foo است، از دندانه گذاری برای مشخص کردن شروع و پایان کلاس استفاده می کنیم. در این مثال، کلاس حاوی دو توضیح تابع (یا متد) است، یکی با نام __init__ و دیگری printVal. همچنین یک متغیر عددی به صورت غیر مستقیم تعریف شده است، که در زیر آن را هم توضیح خواهیم داد.
عکس بالا نشان می دهد که کلاس معین شده به چه شکلی است. دو متد و یک متغیر عددی. با استفاده از این تعریف حال می توانیم چندین نمونه از کلاس ایجاد کنیم. 
میتوانید ببینید که هر دوی متغیر ها پارامتری به نام self را گرفته اند. به صورت سنتی این پارامتر بیشتر self نامیده می شود هرچند می توانید هر نامی به جای آن قرار دهید اما باعث گیج شدن برنامه نویسان دیگری که به کد شما نگاه می اندازند می شوید. به دلیل اینکه می توانیم چندین نمونه از کلاس ایجاد کنیم، وقتی متد کلاسی صدا زده شود، باید بداند که با کدام نمونه کار بکند، و اینجا آنجایی است که self به کمک ما خواهد آمد. 
__init__ متدی خاص است که وقتی پایتون نمونه جدیدی از کلاس میسازد صدا زده می شود(برای مثال: استفاده از چاقو برای ساختن کلوچه های کوچکتر). در مثال ما، یک پارامتر به نام val قبول می کند (به جز پارامتر الزامی self) و یک کپی از آن در متغیر عضو میگیرد، همچنین با نام val. خلاف زبان های دیگر، که متغیر ها قبل از استفاده باید معین شونند، پایتون متغیر ها را می سازد، وقتی اول معین شده باشند، و متغیر های عضو کلاس از این قائده مستثنی نیستند. برای تمایز متغیر val که به عنوان پارامتر وارد شده و متغیر val عضو کلاس، به دومی پیشوند self را اضافه می کنیم. پس، در جمله زیر:  
self.val به متغیر عضوی که متعلق به نمونه کلاس متدی است که صدا زده شده، اشاره می کند. و val به پارامتری که در متد رد شده است. 
اینها یکم گیج کننده است، پس بیایید به این مثال توجه کنیم:
این نمونه ای از کلاس ما می سازد(مثل چاقویی که کلوچه را میبرد). پایتون به صورت خودکار متد __init__ را برای ما صدا می زند، و ارزشی که ما معین کرده ایم را رد می کند(1). پس یکی از اینها رو میگیریم:
بیایید یکی دیگه بسازیم:
دقیقا چیزهای مشابه بالا اتفاق می افتد، تنها تفاوت این است که در متد __init__ عدد (2) رد می شود. 
حال ما دو شیء جدا داریم، با ارزش های مختلف برای متغیر عضو val.
اگر print.val را برای شیء اول صدا بزنیم، ارزش متغیر عضو آن چاپ می شود:
و اگر هم print.val را برای شیء دوم صدا بزنیم، ارزش متغیر عضو خودش را چاپ می کند:

۰ نظر موافقین ۰ مخالفین ۰ ۱۵ مرداد ۹۴ ، ۱۱:۳۷
Ali M

چطور RubyGems را در لینوکس نصب کنیم! (اوبونتو و بقیه)

دوشنبه, ۲۴ فروردين ۱۳۹۴، ۱۰:۱۸ ب.ظ

RubyGems یک برنامه مدیریت پکیج برای روبی (Ruby) است که برای توضیع سریع و آسان برنامه ها و کتابخانه های روبی به کار می رود. اگر قصد هر نوع توسعه ای در روبی دارید، به این برنامه نیاز دارید. در این پست به شما چگونگی نصب این برنامه مفید رو آموزش خواهیم داد. 


نصب RubyGems با استفاده از apt-get در اوبونتو

sudo apt-get install rubygems


نصب RubyGems با استفاده از yum


sudo yum install rubygems


روش نصب دستی

wget http://production.cf.rubygems.org/rubygems/rubygems-1.5.0.tgz
tar xvf rubygems-1.5.0.tgz
cd rubygems-1.5.0
sudo ruby setup.rb


کار به اتمام رسید. حال می توانید برنامه های Gem را با دستور gem install نصب نمایید.

۰ نظر موافقین ۰ مخالفین ۰ ۲۴ فروردين ۹۴ ، ۲۲:۱۸
Ali M