ដោយប្រើបណ្ណាល័យស្តង់ដារ Python អ្នកអាចទទួលបានទំហំ (សមត្ថភាព) នៃឯកសារ ឬទំហំសរុបនៃឯកសារដែលមាននៅក្នុងថតមួយ។
វិធីសាស្រ្តបីខាងក្រោមត្រូវបានពន្យល់។ ឯកតានៃទំហំដែលអាចទទួលបានគឺទាំងអស់បៃ។
- ទទួលបានទំហំឯកសារ:
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() ដើម្បីកំណត់ថាតើវាជាឯកសារ ឬថត។ ប្រសិនបើវាជាឯកសារ ទំហំត្រូវបានទទួលពីគុណលក្ខណៈ st_size នៃវត្ថុ stat_result ។ ក្នុងករណីនៃថតមួយ មុខងារនេះត្រូវបានហៅឡើងវិញដើម្បីបន្ថែមទំហំទាំងអស់និងត្រឡប់ទំហំសរុប។
លើសពីនេះទៀត តាមលំនាំដើម is_file() ត្រឡប់ TRUE សម្រាប់តំណភ្ជាប់និមិត្តសញ្ញាទៅឯកសារ។ ដូចគ្នានេះផងដែរ is_dir() ត្រឡប់ពិតសម្រាប់តំណភ្ជាប់និមិត្តសញ្ញាទៅថត។ ប្រសិនបើអ្នកចង់មិនអើពើតំណភ្ជាប់និមិត្តសញ្ញា សូមកំណត់អាគុយម៉ង់ follow_symlinks នៃ is_file() និង is_dir() ទៅជាមិនពិត។
ដូចគ្នានេះផងដែរ ប្រសិនបើអ្នកមិនចាំបាច់ឆ្លងកាត់ថតរងទេ អ្នកគ្រាន់តែអាចលុបផ្នែកខាងក្រោមបាន។
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()
មិនមាន os.scandir() នៅក្នុង Python 3.4 ឬមុននេះទេ ដូច្នេះសូមប្រើ 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