کار با Hard Disk ها در Python

کار با Hard Disk در پایتونشاید شما هم مثل من نیاز داشته باشید که در برنامه هایی که با پایتون می نویسید از وضعیت هارد دیسک ها و اطلاعات دقیق شون مطلع شوید و در واقع به زبان ساده تر با هارد دیسک ها در پایتون تعامل کنید. خوب باید بگم که این کار کاملا ممکنه و پایتون مثل همیشه این کار رو هم برامون آسون کردن.با من تا ادامه این آموزک همراه باشید :)نصب کتابخانهخوب برای کار با هارد دیسک ها باید کتابخانه psutil رو نصب کنید. پس دستور زیر رو در CMD می زنید.pip install -U psutilکتابخانه ی psutil یک کتابخانه چند پلتفرمی برای Processes و نظارت بر فعالیت های سیستمی است. مانند : فرایند های در حال اجرا در سیستم مثل CPU ، حافظه ، دیسک ها ، شبکه ، حسگرها و ...این کتابخانه عمدتا برای نظارت بر سیستم ، نمایه سازی ، محدود و مدیریت کردن منابع سیستم، مدیریت و بهینه سازی فرایند های در حال اجرا در سیستم استفاده می شود. همچنین این کتابخانه بسیاری از قابلیت های ارائه شده توسط ابزارهای خط فرمان UNIX را اجرا می کند. مانند : pstoplsofnetstatifconfigwhodfkillfreeniceioniceiostatiotopuptimepidofttytasksetpmapکتابخانه psutil در حال حاضر از سیستم عامل های زیر پشتیبانی می کند:LinuxWindowsmacOSFreeBSD, OpenBSD, NetBSDSun SolarisAIXالبته اینا فقط یه سری توضیحات معرفی بود و ما تو این آموزش هیچ کاری با اینا نداریم و فقط با استفاده از این کتابخانه یه سری اطلاعات در مورد هارد دیسک ها به دست می یاریم.یه توضیح خیلی کوتاهانواع هارد دیسک های ذخیره سازیدر این Script که اینجا نوشته خواهد شد شما قادر خواهید بود که اطلاعات هر نوع هاردی که هنگام اجرا آن به کامپیوتر وصل است را دریافت کنید. البته با این کتابخانه کار های بیشتری نیز می توان با هارد و خیلی چیز های دیگر انجام داد که در محوریت آموزک ما نیست.دریافت وضعیت فضای ذخیره سازی هارد دیسکبرای اینکه بفهمیم یک هارد دیسک چقدر فضای ذخیره سازی دارد، چه مقدار از آن استفاده شده، چه مقدار از آن آزاد است باید از تابع disk_usage از کتابخانه psutil استفاده کنیم.کد :import psutil C_Drive = psutil.disk_usage('C:\\') print(C_Drive)در Script بالا در خط اول کتابخانه psutil رو ایمپورت میکنیم و در خط دوم یک متغیر با نام C_Drive که حاوی خروجی (اطلاعات مورد نیاز) تابع disk_usage است را تعریف می کنیم. در نهایت هم آن را print میگیریم.نکته ای که این تابع داره اینکه باید بهش بگید که کدوم درایو رو بررسی کنه که ما در اینجا به صورت رشته، path درایو سی رو بهش می دیم. که شما می تونید با این حال ها بهش پاس بدید (فقط به جای C نام پارتیشن درایو مورد نظر را بنویسید.) :C:c:C:\\c:\\خروجی :اعداد و ارغام خروجی کد بالا در هر کامپیوتر متفاوت است. برای مثال در کامپیوتر من اطلاعات Drive سی بدین شکل است:sdiskusage(total=141157117952, used=105770504192, free=35386613760, percent=74.9)بیاید باهم این خروجی رو بررسی کنیم.پارامتر total کل فضای ذخیره سازی هارد دیسک را بر حسب بایت بر می گرداند.پارامتر used مقدار استفاده شده از کل فضای هارد دیسک را بر حسب بایت بر می گرداند.پارامتر free مقدار آزاد و استفاده نشده از کل فضای هارد دیسک را بر حسب بایت بر می گرداند.پارامتر percent مقدار استفاده شده فضا بر حسب درصد را به صورت تقریب گرد کردن تا یک رقم اعشار را نشان می دهد.(در سیستم عامل های لینوکسی شاید این پارامتر تا 5 واحد ضریب خطا داشته باشد.)دو تا نکته داره :1. اول اینکه اگه درایو پیدا نشه OSError بر می گردونه2. دوم اینکه خروجی به صورت یک نمونه از کلاس psutil._common.sdiskusage هستش و برای اینکه بتونیم در برنامه ازش استفاده کنیم دو راه داریم.راه اول : می تونیم ازش با کد زیر خروجی لیست بگیریم.C_Drive_List = list(C_Drive) print(C_Drive_List)که خروجی ش به این شکلی یه :[ list Outpot ] -> [141157117952, 105770504192, 35386613760, 74.9] راه دوم : به پارامتر هاش یکی یکی دسترسی پیدا کنیم (مثل کد زیر).print(f'Total Disk : {C_Drive.total} Byte') print(f'Used Disk : {C_Drive.used} Byte') print(f'Free Disk : {C_Drive.free} Byte') print(f'Percent Disk : {C_Drive.percent} %')که خروجی ش این شکلی یه :Total Disk : 141157117952 Byte Used Disk : 105770504192 Byte Free Disk : 35386613760 Byte Percent Disk : 74.9 %به دست آوردن پارتیشن ها و اطلاعات آنهاپارتیشن بندی یعنی اینکه یک یا چند هارد که به کامپیوتر وصل اند را به بخش های مختلف (درایو ها) تقسیم از آنها استفاده کنیم مثل نصب دو یا چند سیستم عامل بر روی یک هارد و ...حالا پارتیشن چیه؟ به هر کدوم از این بخش ها یه پارتیشن گفته میشه مثل درایو C، درایو D، درایو CD و DVD، هر فلش، هر هارد SD، هر هارد اکسترنالی که سیستم وصل میشه (البته هارد های اکسترنال رو هم میشه جدا گانه پارتیشن بندی کرد) و کلا به زبون خودمون پارتیشن ها همون درایو ها هستن.خوب حرف بسه، بریم سراغ کد.کد :import psutil Drives = psutil.disk_partitions() print(Drives)در Script بالا در خط اول کتابخانه psutil رو ایمپورت میکنیم و در خط دوم یک متغیر با نام Drives که حاوی خروجی (لیستی از پارتیشن های سیستم و اطلاعات آنهاست) تابع disk_partitions است را تعریف می کنیم. در نهایت هم آن را print میگیریم.نکته ای هم که این تابع داره اینکه خروجی یک لیست حاوی اطلاعات پارتیشن های سیستم که هر کدوم از آنها یک نمونه از کلاس psutil._common.sdiskpart هستن. البته جلوتر بهش می پردازیم.خروجی :این اطلاعات در هر کامپیوتر متفاوته ولی در کامیوتر من به این شکل عه[ sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='', opts='cdrom', maxfile=255, maxpath=260), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='', opts='cdrom', maxfile=255, maxpath=260), sdiskpart(device='G:\\', mountpoint='G:\\', fstype='FAT32', opts='rw,removable', maxfile=255, maxpath=260) ]خوب بیاید با هم دیگه این اطلاعات رو بررسی کنیم.این کد تمام درایو های من من را شناسایی کرده است. (درایو C، درایو D، درایو E که سی دی رام فیزیکی است، درایو F که سی دی رام مجازی است، درایو G که فلش است) می بینیم که همشون رو آورده و حالا بریم ببینیم که اطلاعات دورن هر کدوم چی هستن.پارامتر device : مسیر یا همون path دیوایس رو نشون میده، به زبون خودمون تو ویندوز ما بهش میگن درایو مثل "\\:C" در ویندوز و "/dev/hda1" در سیستم عامل های لینوکسی و macOSپارامتر mountpoint : یا همون نقطه اتصال که تو ویندوز بهش همون درایو میگن مثل "\\:C" . توی سیستم عمل های لینوکسی و macOS اگه بخوام ساده و مختصر توضیح بدم، وقتی که شما یک یا چند هارد رو پارتیشن بندی میکنید و برای مثال به سه Device به نام های sdb,sda و sdc تقسیم میکند. بعد این کار باید هر کدام را به یک دایرکتوری مانند / یا boot/ اتصال دهید. این پارامتر دایکتوری اتصال داده شده را نشان میدهد.پارامتر fstype : که مخفف File System Type هستش نوع سیستم فایل درایو یا همون دیوایس را نشان میدهد که میتواند اطلاعات مهمی را در اختیار ما بگذارد برای مثال میتوانیم از طریق این پارامتر تشخیص دهیم که نوع درایو ما چیست (فلش است، SD است، هارد کامپیوتری است و ...) برای مثال درایو G من یک فلش است که از نوع FAT32 آن میتوان این را تشخیص داد. البته تعداد این نوع ها در هر سیستم عامل متفاوت و زیاد است. باید بر روی آنها تحقیق کنید تا تشخیص بهتری داشته باشید.پارامتر opts : این پارامتر نیز مثل قبلی ها خیلی اطلاعات مهمی رو به ما میده ولی بسته به نوع سیستم عامل هستش و مقادیر خیلی زیادی داره و در هر سیستم عامل متفاوته، در کل یک رشته است که اطلاعات رو با کاما جدا میکنه و به ما نشان میده مثل درایو C من که 'rw,fixed' هستش. rw که مخفف reading and writing هست یعنی این هارد هم میتونه اطلاعات رو بنویسه و هم بخونه. fixed هم یعنی هارد ثابته و مثل فلش و هارد اکسترنال و ... نمیشه جابه جا ش کرد (یعنی درون کیس عه) یا درایو E که cdrom هستش یعنی که نوع این درایو سی دی خوان هست که درسته (البته اگه CD یا DVD وارد آن بشه این اطلاعات تغییر میکنه). یا درایو G من که 'rw,removable' هستش یعنی هم میتونه اطلاعات رو بخونه و بنویسه و هم قابلیت جابه جایی داره.پارامتر maxfile : حداکثر طول کاراکتر های نام یک فایل در این درایو را مشخص می کند.پارامتر maxpath : حداکثر طول نام یک مسیر (نام دایرکتوری + نام فایل اصلی) که می تواند داشته باشد. را در این درایو مشخص می کند.همه این پارامتر ها اطلاعات مهمی را در اختیار ما می گذارند که میتواند خیلی مفید باشد. فقط تعداد این خروجی ها زیاد و در هر سیستم عامل متفاوت است که نمیتوان همه آنها را در این آموزک گفت. من پیشنهاد میکنم که در فرصتی مناسب در مورد همه آنها تحقیق کنی تا بتوانید از این اطلاعات بهترین استفاده را ببریدفقط میمونه استفاده از آنها در برنامه که چون خروجی به صورت لیستی از نمونه های کلاس sdiskpart هستن. میشه اونا رو تبدیل به لیست کرد. مثل کد زیر :Drives_list = [] for Drive in Drives: Drives_list.append(list(Drive)) print(Drives_list)که خروجی ش میشه این : [ ['C:\\', 'C:\\', 'NTFS', 'rw,fixed', 255, 260], ['D:\\', 'D:\\', 'NTFS', 'rw,fixed', 255, 260], ['E:\\', 'E:\\', '', 'cdrom', 255, 260], ['F:\\', 'F:\\', '', 'cdrom', 255, 260] ['G:\\', 'G://', 'FAT32', 'rw,removable', 255, 260] ]یا اینکه می تونید به هر کدوم از پارامتر هاش تک تک دسترسی پیدا کرد مثل کد زیر :for Drive in Drives: print(f'Drive {Drive.device[0:1]} :') print(f'\tMount Point : {Drive.mountpoint[0:2]}') print(f'\tFile System Type : {Drive.fstype if &quot&quot else None}') print(f'\tOpts : {Drive.opts}') print(f'\tMax File : {Drive.maxfile}') print(f'\tMax Path : {Drive.maxpath}') print('\n')که خروجی ش این شکلی یه :Drive C : Mount Point : C: File System Type : None Opts : rw,fixed Max File : 255 Max Path : 260 Drive D : Mount Point : D: File System Type : None Opts : rw,fixed Max File : 255 Max Path : 260 Drive E : Mount Point : E: File System Type : None Opts : cdrom Max File : 255 Max Path : 260 Drive F : Mount Point : F: File System Type : None Opts : cdrom Max File : 255 Max Path : 260 Drive G : Mount Point : G: File System Type : FAT32 Opts : rw,removable Max File : 255 Max Path : 260