Найти в Дзене
IT Start | 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)

Итог:

-2

Видеоурок

Заключение

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

Мой Telegram канал

Мой YouTube канал

Курс по созданию GUI на Python