Отримання розміру файлу або каталогу (папки) в Python

Бізнес

Використовуючи OS стандартної бібліотеки 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() повертає 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()

У 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(), яка повертає 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