Python معیاری لائبریری OS کا استعمال کرتے ہوئے، آپ فائل کا سائز (صلاحیت) یا ڈائریکٹری میں موجود فائلوں کا کل سائز حاصل کر سکتے ہیں۔
مندرجہ ذیل تین طریقوں کی وضاحت کی گئی ہے۔ جس سائز کی اکائیاں حاصل کی جا سکتی ہیں وہ تمام بائٹس ہیں۔
- فائل کا سائز حاصل کریں۔:
os.path.getsize() - درج ذیل فنکشنز کو ملا کر ڈائرکٹری کا سائز حاصل کریں (Python 3.5 یا بعد میں):
os.scandir() - ڈائرکٹری کا سائز حاصل کرنے کے لیے درج ذیل فنکشنز کو یکجا کریں (Python 3.4 اور اس سے پہلے):
os.listdir()
فائل کا سائز حاصل کریں۔:os.path.getsize()
فائل کا سائز (صلاحیت) os.path.getsize() سے حاصل کیا جا سکتا ہے۔
اس فائل کا راستہ دیں جس کا سائز آپ دلیل کے طور پر حاصل کرنا چاہتے ہیں۔
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
ڈائریکٹری کا سائز حاصل کریں (فولڈر):os.scandir()
ڈائریکٹری (فولڈر) میں موجود فائلوں کے کل سائز کا حساب لگانے کے لیے، os.scandir() استعمال کریں۔
یہ فنکشن Python 3.5 میں شامل کیا گیا تھا، اس لیے پہلے کے ورژن os.listdir() استعمال کرتے ہیں۔ os.listdir() مثال بعد میں بیان کی گئی ہے۔
مندرجہ ذیل کے طور پر ایک فنکشن کی وضاحت کریں.
def get_dir_size(path='.'):
total = 0
with os.scandir(path) as it:
for entry in it:
if entry.is_file():
total += entry.stat().st_size
elif entry.is_dir():
total += get_dir_size(entry.path)
return total
print(get_dir_size('data/src'))
# 56130856
os.scandir() os.DirEntry آبجیکٹ کا ایک تکرار کرنے والا واپس کرتا ہے۔
DirEntry آبجیکٹ، اس بات کا تعین کرنے کے لیے is_file() اور is_dir() طریقے استعمال کریں کہ آیا یہ فائل ہے یا ڈائریکٹری۔ اگر یہ ایک فائل ہے تو، سائز stat_result آبجیکٹ کے st_size وصف سے حاصل کیا جاتا ہے۔ ڈائرکٹری کے معاملے میں، اس فنکشن کو تمام سائزز کو شامل کرنے اور کل سائز واپس کرنے کے لیے بار بار کہا جاتا ہے۔
اس کے علاوہ، بطور ڈیفالٹ، is_file() فائلوں کے علامتی لنکس کے لیے TRUE لوٹاتا ہے۔ اس کے علاوہ، is_dir() ڈائریکٹریز کے علامتی لنکس کے لیے صحیح لوٹاتا ہے۔ اگر آپ علامتی لنکس کو نظر انداز کرنا چاہتے ہیں تو is_file() اور is_dir() کے follow_symlinks دلیل کو غلط پر سیٹ کریں۔
اس کے علاوہ، اگر آپ کو ذیلی ڈائریکٹریوں کو عبور کرنے کی ضرورت نہیں ہے، تو آپ صرف درج ذیل حصے کو حذف کر سکتے ہیں۔
elif entry.is_dir():
total += get_dir_size(entry.path)
مندرجہ بالا فنکشن ناکام ہو جائے گا اگر فائل کا راستہ دلیل کے طور پر منظور کیا جاتا ہے. اگر آپ کو کسی فائل یا ڈائرکٹری کا سائز واپس کرنے کے لیے فنکشن کی ضرورت ہو تو آپ درج ذیل کو لکھ سکتے ہیں۔
def get_size(path='.'):
if os.path.isfile(path):
return os.path.getsize(path)
elif os.path.isdir(path):
return get_dir_size(path)
print(get_size('data/src'))
# 56130856
print(get_size('data/src/lena_square.png'))
# 473831
ڈائریکٹری کا سائز حاصل کریں (فولڈر):os.listdir()
Python 3.4 یا اس سے پہلے میں کوئی os.scandir() نہیں ہے، لہذا os.listdir() استعمال کریں۔
مندرجہ ذیل کے طور پر ایک فنکشن کی وضاحت کریں.
def get_dir_size_old(path='.'):
total = 0
for p in os.listdir(path):
full_path = os.path.join(path, p)
if os.path.isfile(full_path):
total += os.path.getsize(full_path)
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
return total
print(get_dir_size_old('data/src'))
# 56130856
بنیادی خیال وہی ہے جو os.scandir() کے معاملے میں ہے۔
os.listdir() کے ساتھ جو کچھ حاصل کیا جاسکتا ہے وہ فائل کے ناموں (ڈائریکٹری کے نام) کی فہرست ہے۔ ہر فائل کا نام یا ڈائریکٹری کا نام os.path.join() کے ساتھ پیرنٹ ڈائرکٹری کے راستے کے ساتھ جوڑ دیا جاتا ہے تاکہ مکمل راستہ بنایا جا سکے۔
اگر ہدف ایک علامتی لنک ہے تو، os.path.isfile() اور os.path.isdir() ہستی کا فیصلہ کریں گے۔ لہذا، اگر آپ علامتی روابط کو نظر انداز کرنا چاہتے ہیں، تو os.path.islink() کے ساتھ مل کر مشروط فیصلے کا استعمال کریں، جو علامتی روابط کے لیے درست ثابت ہوتا ہے۔
جیسا کہ os.scandir() کے معاملے میں، اگر آپ کو ذیلی ڈائریکٹریوں کو عبور کرنے کی ضرورت نہیں ہے، تو صرف درج ذیل حصے کو حذف کر دیں۔
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
مندرجہ بالا فنکشن ناکام ہو جائے گا اگر فائل کا راستہ دلیل کے طور پر منظور کیا جاتا ہے. اگر آپ کو کسی فائل یا ڈائرکٹری کا سائز واپس کرنے کے لیے فنکشن کی ضرورت ہو تو آپ درج ذیل کو لکھ سکتے ہیں۔
def get_size_old(path='.'):
if os.path.isfile(path):
return os.path.getsize(path)
elif os.path.isdir(path):
return get_dir_size_old(path)
print(get_size_old('data/src'))
# 56130856
print(get_size_old('data/src/lena_square.png'))
# 473831


