Skip to content

Instantly share code, notes, and snippets.

@jigi-33
Last active August 28, 2020 05:01
Show Gist options
  • Save jigi-33/a966f03d85daeb487f98e468546a21fc to your computer and use it in GitHub Desktop.
Save jigi-33/a966f03d85daeb487f98e468546a21fc to your computer and use it in GitHub Desktop.
Посчитать рекурсивно размер файлов в директории на Python

Посчитать рекурсивно размер файлов

Задача:

Надо посчитать размер всех файлов в подпапке, которая находится в главной папке, при этом не считать сам размер подпапки А вводить надо путь главной папки В главной папки всего 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 поиграться.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment