Как узнать размер каталога в Python

Как узнать размер каталога в Python Статьи

Введение

В данной статье научимся определять размер каталога при помощи языка программирования Python, и нарисуем круговую диаграмму.

Функция определяющая размер каталога

Для написание кода нам понадобится модуль os. Импортируем его:

import os

Создадим функцию get_directory_size(), в качестве аргумента передадим directory. Внутри функции будет производиться расчёт размера каталога/ов или же файла/ов.

import os


def get_directory_size(directory):

Создадим переменную total равную нулю. Далее добавим конструкцию try … except. В try добавим цикл, в котором пройдёмся по всем файлам в каталоге. Если файл присутствует, то прибавляем к переменной total размер файла в байтах. В elif укажем условие, что если каталог присутствует, то прибавляем к total рекурсивный вызов функции и в качестве аргумента передаём путь до каталога.

import os


def get_directory_size(directory):
    total = 0
    try:
        for entry in os.scandir(directory):
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_directory_size(entry.path)
    except NotADirectoryError:
        # Если встретился не каталог, а файл, то вернётся его размер
        return os.path.getsize(directory)
    except PermissionError:
        # Если папка не открывается, вернётся 0
        return 0
    return total

Функция для преобразование большого количество байтов в масштабированный формат

Ранее написанная функция get_directory_size() возвращает размер в байтах, который, конечно, будет нечитаемым для больших каталогов, в результате давайте создадим функцию для масштабирования этих байтов до Килобайт, Мега, Гига и т. д. Функцию назовём get_size_format(), и в качестве аргументов укажем b (байты), factor, suffix. Внутри функции создадим цикл, внутри которого пройдёмся по списку с наименованиями (килобайты, мегабайты, гигабайты, терабайты, петабайты и т.д.):

import os


def get_size_format(b, factor=1024, suffix="B"):
    for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:

Внутри цикла добавим условие, что если количество байт меньше 1024, то вернётся количество байт и единица измерения. Если же условие не сработало, то байты делятся целочисленно на factor:

import os


def get_size_format(b, factor=1024, suffix="B"):
    for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:
        if b < factor:
            return f"{b:.2f}{unit}{suffix}"

        b /= factor
    return f"{b:.2f}Y{suffix}"

Функция создания круговой диаграммы

Для рисования круговой диаграммы нам понадобится модуль matplotlib. Чтобы его установить нужно перейти в терминал, или же командную строку, прописать pip install matplotlib, нажать Enter и ждать установки. После инсталляции импортируем pyplot:

import matplotlib.pyplot as plt

Создадим функцию plot_pie(), в качестве параметров укажем sizes и names. Создадим круговую диаграмму, в которую выведем все полученные значения в параметрах sizes и names.

import matplotlib.pyplot as plt

def plot_pie(sizes, names):
    plt.pie(sizes, labels=names, autopct=lambda pct: f"{pct:.2f}%")

Добавим заголовок круговой диаграмме и отобразим её:

import matplotlib.pyplot as plt

def plot_pie(sizes, names):
    plt.pie(sizes, labels=names, autopct=lambda pct: f"{pct:.2f}%")
    plt.title("Размеры подкаталогов и файлов")
    plt.show()

Написание кода

Создадим переменную file_path, в которую сохраним путь к папке с файлами. Также создаём ещё 2 пустых списка directory_sizes и names:

import os
import matplotlib.pyplot as plt


def get_size_format(b, factor=1024, suffix="B"):
    for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:
        if b < factor:
            return f"{b:.2f}{unit}{suffix}"

        b /= factor
    return f"{b:.2f}Y{suffix}"


def get_directory_size(directory):
    total = 0
    try:
        for entry in os.scandir(directory):
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_directory_size(entry.path)
    except NotADirectoryError:
        # Если встретился не каталог, а файл, то вернётся его размер
        return os.path.getsize(directory)
    except PermissionError:
        # Если папка не открывается, вернётся 0
        return 0
    return total


def plot_pie(sizes, names):
    plt.pie(sizes, labels=names, autopct=lambda pct: f"{pct:.2f}%")
    plt.title("Размеры подкаталогов и файлов")
    plt.show()


folder_path = r'C:/Тестовая папка'

directory_sizes = []
names = []

Создадим цикл, в котором пройдёмся по всем каталогам внутри пути, который мы указали в переменной folder_path. Во время каждой итерации цикла переменную directory приравниваем к начальному пути, в конец которого с помощью метода join прибавляем название папки в изначальном каталоге. Получаем размер этого каталога с помощью функции get_directory_size() с передаваемым аргументом directory и сохраняем его в список directory_size. В список names с каждой итерацией мы будем добавлять название каталога и его размер:

import os
import matplotlib.pyplot as plt


def get_size_format(b, factor=1024, suffix="B"):
    for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:
        if b < factor:
            return f"{b:.2f}{unit}{suffix}"

        b /= factor
    return f"{b:.2f}Y{suffix}"


def get_directory_size(directory):
    total = 0
    try:
        for entry in os.scandir(directory):
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_directory_size(entry.path)
    except NotADirectoryError:
        # Если встретился не каталог, а файл, то вернётся его размер
        return os.path.getsize(directory)
    except PermissionError:
        # Если папка не открывается, вернётся 0
        return 0
    return total


def plot_pie(sizes, names):
    plt.pie(sizes, labels=names, autopct=lambda pct: f"{pct:.2f}%")
    plt.title("Размеры подкаталогов и файлов")
    plt.show()


folder_path = r'C:/Тестовая папка'

directory_sizes = []
names = []

for directory in os.listdir(folder_path):
    directory = os.path.join(folder_path, directory)
    directory_size = get_directory_size(directory)

    if directory_size == 0:
        continue

    directory_sizes.append(directory_size)
    names.append(os.path.basename(directory) + ": " + get_size_format(directory_size))

Выведем общий размер всего каталога и вызовем функцию plot_pie(), чтобы отобразить диаграмму:

import os
import matplotlib.pyplot as plt


def get_size_format(b, factor=1024, suffix="B"):
    for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:
        if b < factor:
            return f"{b:.2f}{unit}{suffix}"

        b /= factor
    return f"{b:.2f}Y{suffix}"


def get_directory_size(directory):
    total = 0
    try:
        for entry in os.scandir(directory):
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_directory_size(entry.path)
    except NotADirectoryError:
        # Если встретился не каталог, а файл, то вернётся его размер
        return os.path.getsize(directory)
    except PermissionError:
        # Если папка не открывается, вернётся 0
        return 0
    return total


def plot_pie(sizes, names):
    plt.pie(sizes, labels=names, autopct=lambda pct: f"{pct:.2f}%")
    plt.title("Размеры подкаталогов и файлов")
    plt.show()


folder_path = r'C:/Тестовая папка'

directory_sizes = []
names = []

for directory in os.listdir(folder_path):
    directory = os.path.join(folder_path, directory)
    directory_size = get_directory_size(directory)

    if directory_size == 0:
        continue

    directory_sizes.append(directory_size)
    names.append(os.path.basename(directory) + ": " + get_size_format(directory_size))

print("Общий размер каталога:", get_size_format(sum(directory_sizes)))
plot_pie(directory_sizes, names)

Итог:

Видеоурок

Получаем размер каталога (папки) в python

Заключение

В ходе статьи мы с Вами научились определять размер каталога с файлами при помощи языка программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin
Admin
IT Start