دریافت اندازه یک فایل یا پوشه (پوشه) در پایتون

کسب و کار

با استفاده از سیستم عامل کتابخانه استاندارد پایتون، می توانید اندازه (ظرفیت) یک فایل یا حجم کل فایل های موجود در یک فهرست را دریافت کنید.

سه روش زیر توضیح داده شده است. واحدهای اندازه هایی که می توان به دست آورد همه بایت هستند.

  • اندازه فایل را دریافت کنید:os.path.getsize()
  • اندازه یک دایرکتوری را با ترکیب توابع زیر بدست آورید (Python 3.5 یا بالاتر):os.scandir()
  • برای بدست آوردن اندازه دایرکتوری، توابع زیر را ترکیب کنید (پایتون 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() استفاده کنید.

این تابع در پایتون 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() true را برای پیوندهای نمادین به دایرکتوری ها برمی گرداند. اگر می خواهید پیوندهای نمادین را نادیده بگیرید، آرگومان follow_symlinks is_file() و is_dir() را روی false قرار دهید.

همچنین، اگر نیازی به پیمایش زیر شاخه ها ندارید، می توانید فقط قسمت زیر را حذف کنید.

            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() در پایتون 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() استفاده کنید که برای پیوندهای نمادین true برمی‌گرداند.

همانطور که در مورد 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
Copied title and URL