- Как узнать размер каталога в Python
- Введение
- Функция определяющая размер каталога
- Функция для преобразование большого количество байтов в масштабированный формат
- Функция создания круговой диаграммы
- Написание кода
- Видеоурок
- Заключение
- Получение размера файла или каталога (папки) в Python
- Получить размер файла: os.path.getsize()
- Получить размер каталога (папки): os.scandir()
- Получить размер каталога (папки): os.listdir()
Как узнать размер каталога в Python
Статьи
Введение
В данной статье научимся определять размер каталога при помощи языка программирования Python, и нарисуем круговую диаграмму.
Функция определяющая размер каталога
Для написание кода нам понадобится модуль 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 /= factor return f"Y"
Функция создания круговой диаграммы
Для рисования круговой диаграммы нам понадобится модуль 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"%")
Добавим заголовок круговой диаграмме и отобразим её:
import matplotlib.pyplot as plt def plot_pie(sizes, names): plt.pie(sizes, labels=names, autopct=lambda pct: f"%") 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 /= factor return f"Y" 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"%") 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 /= factor return f"Y" 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"%") 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 /= factor return f"Y" 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"%") 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
Используя стандартную библиотеку Python os, вы можете получить размер (емкость) файла или общий размер файлов, содержащихся в каталоге.
Ниже описаны три метода. Единицы измерения размеров, которые могут быть получены, — все байты.
- Получить размер файла : 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