Нужно вывести количество файлов определенных размеров словарем
Скрипт, который посчитает файлы в папке, посчитает их размер, и выведет в виде словаря в формате
меньше или столько-то байтов : такое количество файлов
меньше или столько байтов : столько файлов.
Я не могу сообразить как это все объединить.
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