Нужно вывести количество файлов определенных размеров словарем

Скрипт, который посчитает файлы в папке, посчитает их размер, и выведет в виде словаря в формате

меньше или столько-то байтов : такое количество файлов

меньше или столько байтов : столько файлов.

Я не могу сообразить как это все объединить.

import os
directory = r'my_direct'

for f in os.listdir(directory):
    path = os.path.join(directory, f)
    if os.path.isfile(path):
        print(os.path.getsize(path))

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

list = os.listdir(directory)
number_files = len(list)
print(number_files)

Это даст количество файлов, причем включая вложенные папки.

Помогите довести до нужного результата.


Ответы (2 шт):

Автор решения: GrAnd

Для рекурсивного обхода каталогов есть os.walk(). Ну и как-то так можно сгруппировать файлы по размерам:

import os

directory = r'.'
groups = [1000, 10000, 100000, 1000000]  # размеры, на какие группы разбивать
groups += [float("inf")]                 # последняя группа для "меньше бесконечности"
result = dict.fromkeys(groups, 0)

# обходим всю иерархию подкаталогов
for path_from_top, subdirs, files in os.walk(directory):
    for file in files:
        path = os.path.join(path_from_top, file)
        size = os.path.getsize(path)
        # вычисляем ближайшее большее число из groups, куда и посчитаем файл
        to_group = min(filter(lambda x: size < x, groups))
        result[to_group] += 1

prev_size = 0
for size in groups:
    print(f"Файлов размером (байт) от {prev_size:10} до {size:10} : {result[size]}")
    prev_size = size
Файлов размером (байт) от          0 до       1000 : 54
Файлов размером (байт) от       1000 до      10000 : 55
Файлов размером (байт) от      10000 до     100000 : 6
Файлов размером (байт) от     100000 до    1000000 : 0
Файлов размером (байт) от    1000000 до        inf : 2
→ Ссылка
Автор решения: handowl

На ум приходит только такое.

array = [os.path.getsize(f) for f in os.listdir(directory)]
middle = (max(array)+min(array))//2
result = {f'Меньше или равно {max(array)}': len([i for i in array if i > middle]),
          f'Меньше или равно {middle}': len([i for i in array if i <= middle]),
          'Всего': len(os.listdir(directory))}

Если у Вас есть какой-то алгоритм, по которому группируются размеры, можете использовать его вместе middle

→ Ссылка