Узнать вес папки python

Как узнать размер директории через Python?

В никсах существует прекрасная команда du, для того что бы сразу показать размер поддиректорий в директории.
Как это реализовать через Python скрипт?

import os #Указываю директорию basedir = "/home/user/test/" #Пока примем что размер поддиректорий равен 0 sub_size = 0 #Так как мы не знаем сколько поддиректорий в директории, получаем их названия. subnames = os.listdir(basedir) #Далее через цикл сплитим пути до поддиректорий. for subname in subnames: subpath = "%s/%s" % (os.path.dirname(basedir), subname) #Потом через walk, получим кортеж (путь до директории, поддиректория, файлы) for path, subdirs, files in os.walk(subpath): #Кто у нас "ест" место? Проходимся по этим файлам и складываем размер for files in file: #Получаем полный путь до файла. filename = os.path.join(path, file) #Узнаем его размер и увеличиваем размер папки sub_size += os.path.getsize(filename) /1024 /1024 print "%s - %.1f Mb" % (basedir[len[basedir]: ], sub_size)

НО. оно выводит мне размер поддиректорий..так что размер второй поддиректории равен сумме размеров первой и второй, и так далее.

Если я правильно понял, то нужно переместить sub_size = 0:

import os basedir = "/home/user/test/" subnames = os.listdir(basedir) for subname in subnames: sub_size = 0 subpath = "%s/%s" % (os.path.dirname(basedir), subname) for path, subdirs, files in os.walk(subpath): for files in file: filename = os.path.join(path, file) sub_size += os.path.getsize(filename) /1024 /1024 print "%s - %.1f Mb" % (basedir[len[basedir]: ], sub_size)

Источник

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

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

Читайте также:  Create python project pycharm

Источник

Получение размера файла или каталога (папки) в Python

From-Locals

Используя стандартную библиотеку 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.

Читайте также:  Плита комбинированная beko css 42014 fw

Также, если вам не нужно переходить по подкаталогам, вы можете просто удалить следующую часть.

 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 

Источник

Оцените статью