Надо посчитать размер всех файлов в подпапке, которая находится в главной папке, при этом не считать сам размер подпапки А вводить надо путь главной папки В главной папки всего 4 подпапки На экран должен выводится размер каждой подпапки отдельно Пытался что-то придумать с os.path.getsize(path) не вышло, решил потом вернусь, а время уже поджимает, можете помочь?
Для рекурсивного обхода всех подпапок есть os.walk, берите и используйте его тоже, они оба работают, я гарантирую это Найти суммарный размер всех регулярных файлов в каталоге, рекурсивно обходя все подкаталоги – подробности ниже.
Попробуйте:
import os
from os.path import getsize, join
"""
'.' это поиск в текущей папке
"""
for root, dirs, files in os.walk('.'):
total_size = sum(getsize(join(root, name)) for name in files)
print(root, total_size)
root -- это текущая папка на текущей итерации; dirs -- список папок в root; files -- список файлов в root; join(root, name) -- объединяет путь от текущей папке к файлу в ней; getsize -- вернет размер файла в байтах.
Хочу уточнить, что скрипт показывает размер файлов в папке, но не подсчитывает размер папки с учетом других папок.
Поэтому, если нужно подсчитать размер папки с учетом вложенных папок, можно попробовать такой вариант:
""" Словарь нужен чтобы помнить размер папки. Когда итератор дойдет до родительской папки
в словаре уже будут размеры вложенных папок.
"""
dir_sizes = dict()
for root, dirs, files in os.walk('.', topdown=False):
size = sum(getsize(join(root, f)) for f in files)
size += sum(dir_sizes[join(root, d)] for d in dirs)
dir_sizes[root] = size
for path, total_size in sorted(dir_sizes.items(), key=lambda x: x[0]):
print(path, sizeof_fmt(total_size))
Параметр topdown=False говорит что перебор нужно делать не с корневой папки, а наоборот -- с самого низа.
Если нужен размер в человеко-читаемом формате показать, можно воспользоваться функцией:
def sizeof_fmt(num):
for x in ['bytes', 'KB', 'MB', 'GB']:
if num < 1024.0:
return "%3.1f %s" % (num, x)
num /= 1024.0
return "%3.1f %s" % (num, 'TB')
И вызвать так:
...
print(root, sizeof_fmt(total_size))
Это работает! Тут можно и try/catch, и с аргументами walk'а followlinks и onerror поиграться.