ការទទួលបានទំហំនៃឯកសារឬថត (ថតឯកសារ) នៅក្នុង Python

អាជីវកម្ម

ដោយប្រើបណ្ណាល័យស្តង់ដារ 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