Введение
В данной статье научимся определять размер каталога при помощи языка программирования 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. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Мой Telegram канал
Мой YouTube канал