شاید شما هم مثل من نیاز داشته باشید که در برنامه هایی که با پایتون می نویسید از وضعیت هارد دیسک ها و اطلاعات دقیق شون مطلع شوید و در واقع به زبان ساده تر با هارد دیسک ها در پایتون تعامل کنید. خوب باید بگم که این کار کاملا ممکنه و پایتون مثل همیشه این کار رو هم برامون آسون کردن.
با من تا ادامه این آموزک همراه باشید :)
خوب برای کار با هارد دیسک ها باید کتابخانه psutil رو نصب کنید. پس دستور زیر رو در CMD می زنید.
pip install -U psutil
کتابخانه ی psutil یک کتابخانه چند پلتفرمی برای Processes و نظارت بر فعالیت های سیستمی است. مانند : فرایند های در حال اجرا در سیستم مثل CPU ، حافظه ، دیسک ها ، شبکه ، حسگرها و ...
این کتابخانه عمدتا برای نظارت بر سیستم ، نمایه سازی ، محدود و مدیریت کردن منابع سیستم، مدیریت و بهینه سازی فرایند های در حال اجرا در سیستم استفاده می شود. همچنین این کتابخانه بسیاری از قابلیت های ارائه شده توسط ابزارهای خط فرمان UNIX را اجرا می کند. مانند :
کتابخانه psutil در حال حاضر از سیستم عامل های زیر پشتیبانی می کند:
البته اینا فقط یه سری توضیحات معرفی بود و ما تو این آموزش هیچ کاری با اینا نداریم و فقط با استفاده از این کتابخانه یه سری اطلاعات در مورد هارد دیسک ها به دست می یاریم.
در این Script که اینجا نوشته خواهد شد شما قادر خواهید بود که اطلاعات هر نوع هاردی که هنگام اجرا آن به کامپیوتر وصل است را دریافت کنید. البته با این کتابخانه کار های بیشتری نیز می توان با هارد و خیلی چیز های دیگر انجام داد که در محوریت آموزک ما نیست.
برای اینکه بفهمیم یک هارد دیسک چقدر فضای ذخیره سازی دارد، چه مقدار از آن استفاده شده، چه مقدار از آن آزاد است باید از تابع disk_usage از کتابخانه psutil استفاده کنیم.
import psutil C_Drive = psutil.disk_usage('C:\\') print(C_Drive)
در Script بالا در خط اول کتابخانه psutil رو ایمپورت میکنیم و در خط دوم یک متغیر با نام C_Drive که حاوی خروجی (اطلاعات مورد نیاز) تابع disk_usage است را تعریف می کنیم. در نهایت هم آن را print میگیریم.
نکته ای که این تابع داره اینکه باید بهش بگید که کدوم درایو رو بررسی کنه که ما در اینجا به صورت رشته، path درایو سی رو بهش می دیم. که شما می تونید با این حال ها بهش پاس بدید (فقط به جای C نام پارتیشن درایو مورد نظر را بنویسید.) :
اعداد و ارغام خروجی کد بالا در هر کامپیوتر متفاوت است. برای مثال در کامپیوتر من اطلاعات Drive سی بدین شکل است:
sdiskusage(total=141157117952, used=105770504192, free=35386613760, percent=74.9)
بیاید باهم این خروجی رو بررسی کنیم.
دو تا نکته داره :
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 که فلش است) می بینیم که همشون رو آورده و حالا بریم ببینیم که اطلاعات دورن هر کدوم چی هستن.
"\\:C"
در ویندوز و "/dev/hda1"
در سیستم عامل های لینوکسی و macOS"\\:C"
. توی سیستم عمل های لینوکسی و macOS اگه بخوام ساده و مختصر توضیح بدم، وقتی که شما یک یا چند هارد رو پارتیشن بندی میکنید و برای مثال به سه Device به نام های sdb,sda و sdc تقسیم میکند. بعد این کار باید هر کدام را به یک دایرکتوری مانند / یا boot/ اتصال دهید. این پارامتر دایکتوری اتصال داده شده را نشان میدهد.همه این پارامتر ها اطلاعات مهمی را در اختیار ما می گذارند که میتواند خیلی مفید باشد. فقط تعداد این خروجی ها زیاد و در هر سیستم عامل متفاوت است که نمیتوان همه آنها را در این آموزک گفت. من پیشنهاد میکنم که در فرصتی مناسب در مورد همه آنها تحقیق کنی تا بتوانید از این اطلاعات بهترین استفاده را ببرید
فقط میمونه استفاده از آنها در برنامه که چون خروجی به صورت لیستی از نمونه های کلاس 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 "" 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