Размеры и расширения каталогов - PullRequest
3 голосов
/ 21 августа 2011

Я хотел бы создать код командной строки python, который может печатать дерево каталогов с размерами всех подкаталогов (из определенного каталога) и наиболее часто встречающихся расширений ... Я покажу пример выходных данных.

  • root_dir (5 ГБ, jpg (65%): avi (30%): pdf (5%))

- aa (3 ГБ, jpg (100%))

- bb (2 ГБ, avi (20%): pdf (2%))

--- bbb (1 ГБ, ...)

--- bb2 (1 ГБ, ...)

- куб. См (1 ГБ, pdf (100%))

Формат:

уровень вложенности, имя каталога (размер каталога со всеми файлами и подкаталогами, наиболее часто встречающиеся расширения с процентным соотношением размера в этом каталоге.

У меня есть этот фрагмент кода. Проблема в том, что он учитывает только размеры файлов в каталоге, поэтому результирующий размер меньше реального размера каталога. Другая проблема состоит в том, как собрать все это вместе, чтобы напечатать дерево, которое я определил выше, без лишних вычислений.

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

Расчет размеров каталогов действительно не является сильной стороной Python, как объясняется в этом посте: очень быстро получает общий размер папки . Если у вас есть доступ к du и find, обязательно используйте это. Вы можете легко отобразить размер каждого каталога с помощью следующей строки:

find . -type d -exec du -hs "{}" \;

Если вы настаиваете на этом на python, вы можете предпочесть обход после заказа вместо os.walk, как это предлагает PableG. Но использование os.walk может быть визуально чище, если эффективность не является для вас решающим фактором:

import os, sys
from collections import defaultdict

def walkIt(folder):
    for (path, dirs, files) in os.walk(folder):
        size = getDirSize(path)
        stats = getExtensionStats(files)

        # only get the top 3 extensions
        print '%s (%s, %s)'%(path, size, stats[:3])

def getExtensionStats(files):
    # get all file extensions
    extensions = [f.rsplit(os.extsep, 1)[-1] 
        for f in files if len(f.rsplit(os.extsep, 1)) > 1]

    # count the extensions
    exCounter = defaultdict(int)
    for e in extensions:
        exCounter[e] += 1

    # convert count to percentage
    percentPairs = [(e, 100*ct/len(extensions)) for e, ct in exCounter.items()]

    # sort them
    percentPairs.sort(key=lambda i: i[1])
    return percentPairs

def getDirSize(root):
    size = 0
    for path, dirs, files in os.walk(root):
        for f in files:
            size +=  os.path.getsize( os.path.join( path, f ) )
    return size

if __name__ == '__main__':
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    walkIt(path)
2 голосов
/ 25 августа 2011

Лично я считаю, что os.listdir + a_recursive_function лучше подходит для этой задачи, чем os.walk:

import os, copy
from os.path import join, getsize, isdir, splitext

frequent_ext = { ".jpg": 0, ".pdf": 0 }     # Frequent extensions

def list_dir(base_dir):
    dir_sz = 0  # directory size
    files = os.listdir(base_dir)
    ext_size = copy.copy(frequent_ext)

    for file_ in files:
        file_ = join(base_dir, file_)

        if isdir(file_):
            ret = list_dir(file_)
            dir_sz += ret[0]
            for k, v in frequent_ext.items():           # Add to freq.ext.sizes
                ext_size[k] += ret[1][k]
        else:
            file_sz = getsize(file_)
            dir_sz += file_sz

            ext = os.path.splitext(file_)[1].lower()   # Frequent extension?
            if ext in frequent_ext.keys():
                ext_size[ext] += file_sz

    print base_dir, dir_sz,
    for k, v in ext_size.items():
        print "%s: %5.2f%%" % (k, float(v) / max(1, dir_sz) * 100.),

    print 

    return (dir_sz, ext_size)


base_dir = "e:/test_dir/"
base_dir = os.path.abspath(base_dir)
list_dir(base_dir)
0 голосов
/ 21 августа 2011

@ Cldy Правильно использовать os.path

Например, os.path.walk будет сначала проходить глубину через каждый каталог ниже аргумента и возвращать файлы и папки в каждом каталоге

Используйте os.path.getsize, чтобы получить размеры и разделить, чтобы получить расширения. Храните расширения в списке или дикте и подсчитывайте их после прохождения каждого

Если вы используете Linux, я бы посоветовал посмотреть du.

0 голосов
/ 21 августа 2011

Это модуль, который вам нужен .А также это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...